- To a large degree these features already are guarded in the sense that you have to explicitly define a type family or a GADT. Having to jump through the extra hoop of adding a LANGUAGE pragma is unnecessary friction. Yes there are exceptions to this - needing a LANGUAGE pragma to pattern-match on a GADT for example - I also think this is unnecessary friction, because you can understand what the pattern-match does by looking at the definition of the type. Incidentally you don't need {-# LANGUAGE TypeFamilies #-} to use a type family in a type, so we're not very consistent here.
- I don't think the extra signal of a LANGUAGE pragma or a flag in the Cabal file really adds anything useful for extensions that are largely stable. As a user you don't go looking for these things when reading code so that you can understand what dialect the code is written in, we just read code. There needs to be a common dialect as far as possible.
Having said all this, there definitely are cases where you might want to disable fancy type features. At FB we have a large codebase of DSL code that is used by engineers with a wide range of Haskell experience, so we want to keep the level of fancy-types to a minimum. This is like the "beginner Haskell" use case where we want to be able to turn off a lot of advanced features to flatten the learning curve. This is an important use case that GHC should continue to support by having a way to turn off extensions, but I don't think it means that the default mode should also have these extensions disabled.
Cheers
Simon