Put a lot of compile-time and run-time checks on classes of super regions of all SubRegion classes, in order to maintain the existing status quo.
This should make understanding the hierarchy easier, and probably help us catch some bugs.
This is an API-breaking change (we now require explicit casts to specific region sub-classes), but in practice very few checkers are affected.
I think we should perform a cast<> to SubRegion internally in order to keep API simple and do not force clients to introduce casts in their code. This will still allow us to keep nice suggestions about SubRegions/MemSpaces in our hierarchy.