I think a more appropriate categorization would be to divide it up by the compiler pipeline:
Syntactic extensions
- -XMagicHash
- -XUnicodeSyntax
- -XNewQualifiedOperators
- -XViewPatterns
- -XNPlusKPatterns
- -XDoRec
- -XTransformListComp
- -XNoImplicitPrelude
- -XPostfixOperators
- -XTupleSections
- -XDisambiguateRecordFields
- -XNamedFieldPuns
- -XRecordWildCards
- -XPackageImports
- -XExplicitForAll
- -XKindSignatures
- ...
Type System Extensions
- -XUnboxedTuples
- -XLiberalTypeSynonyms
- -XGADTs
- -XMultiParamTypeClasses
- -XFlexibleContexts
- -XConstrainedClassMethods
- -XOverlappingInstances and -XIncoherentInstances
- -XTypeFamilies
- -XImplicitParams
Cross-cutting extensions
- -XTemplateHaskell
- -XForeignFunctionInterface
Optimizatsions
- -fenable-rewrite-rules
- -fspec-constr
- -O2
Code Generation Extensions
Runtime Extensions
What do you think? Not every flag is either (a) definable in terms of existing constructions, or (b) a new part of the compiler. It's more subtle.
There are many other extensions too, see if you can classify them in this form.