It's often useful if: you need backwards compatibility with an older version of GHC or some library, or you want to avoid compiler warnings you are writing code that depends on OS or CPU architecture you want to enable some parts of code depending on a flag you don't want to bother with Template Haskell and need some easy way to generate code (e.g.