IMO perpetuating the hard-coded MCR-like logic in WikiFilePage/ImagePage is not necessary. That can be generalized to multiple MCR slots without requiring page types.
Claiming that one small if() block in WikiPage::doEditUpdates() "effectively defines page types" for messages is a bit of a stretch, and I see nothing at all that has to do with modules (either Scribunto or anything else I can see). There could perhaps be better abstraction of per-namespace updates in there, although I'm not even sure of that.
I think the tangle being proposed here is a bit telling: page type is somehow determining roles which is somehow determining the main slot content model which is somehow supposed to determine page type.