diff --git a/Distribution/Simple/Compiler.hs b/Distribution/Simple/Compiler.hs
index 9db97daa76797a233a34a3af94c473a0cf4b506c..f6cdb25e763bffb46874ed0dee9d8320ede1981e 100644
--- a/Distribution/Simple/Compiler.hs
+++ b/Distribution/Simple/Compiler.hs
@@ -64,6 +64,8 @@ module Distribution.Simple.Compiler (
 
         -- * Support for language extensions
         Flag,
+        languageToFlags,
+        unsupportedLanguages,
         extensionsToFlags,
         unsupportedExtensions
   ) where
@@ -71,13 +73,14 @@ module Distribution.Simple.Compiler (
 import Distribution.Compiler
 import Distribution.Version (Version(..))
 import Distribution.Text (display)
-import Language.Haskell.Extension (Extension(..))
+import Language.Haskell.Extension (Language(Haskell98), Extension)
 
 import Data.List (nub)
 import Data.Maybe (catMaybes, isNothing)
 
 data Compiler = Compiler {
         compilerId              :: CompilerId,
+        compilerLanguages       :: [(Language, String)],
         compilerExtensions      :: [(Extension, String)]
     }
     deriving (Show, Read)
@@ -157,9 +160,23 @@ flagToOptimisationLevel (Just s) = case reads s of
   _             -> error $ "Can't parse optimisation level " ++ s
 
 -- ------------------------------------------------------------
--- * Extensions
+-- * Languages and Extensions
 -- ------------------------------------------------------------
 
+unsupportedLanguages :: Compiler -> [Language] -> [Language]
+unsupportedLanguages comp langs =
+  [ lang | lang <- langs
+         , isNothing (languageToFlag comp lang) ]
+
+languageToFlags :: Compiler -> Maybe Language -> [Flag]
+languageToFlags comp = filter (not . null)
+                     . catMaybes . map (languageToFlag comp)
+                     . maybe [Haskell98] (\x->[x])
+
+languageToFlag :: Compiler -> Language -> Maybe Flag
+languageToFlag comp ext = lookup ext (compilerLanguages comp)
+
+
 -- |For the given compiler, return the extensions it does not support.
 unsupportedExtensions :: Compiler -> [Extension] -> [Extension]
 unsupportedExtensions comp exts =
diff --git a/Distribution/Simple/GHC.hs b/Distribution/Simple/GHC.hs
index b2777cc606e241cb7d53584b6ffb6e4e21589e43..7fc7100583b85e34936c95355504c074ce8f2a6b 100644
--- a/Distribution/Simple/GHC.hs
+++ b/Distribution/Simple/GHC.hs
@@ -114,7 +114,7 @@ import Distribution.System
 import Distribution.Verbosity
 import Distribution.Text
          ( display, simpleParse )
-import Language.Haskell.Extension (Extension(..))
+import Language.Haskell.Extension (Language(..), Extension(..))
 
 import Control.Monad            ( unless, when )
 import Data.Char                ( isSpace )
@@ -155,11 +155,13 @@ configure verbosity hcPath hcPkgPath conf = do
     ++ programPath ghcProg ++ " is version " ++ display ghcVersion ++ " "
     ++ programPath ghcPkgProg ++ " is version " ++ display ghcPkgVersion
 
-  languageExtensions <- getLanguageExtensions verbosity ghcProg
+  languages  <- getLanguages verbosity ghcProg
+  extensions <- getExtensions verbosity ghcProg
 
   let comp = Compiler {
         compilerId             = CompilerId GHC ghcVersion,
-        compilerExtensions     = languageExtensions
+        compilerLanguages      = languages,
+        compilerExtensions     = extensions
       }
       conf''' = configureToolchain ghcProg conf'' -- configure gcc and ld
   return (comp, conf''')
@@ -280,8 +282,17 @@ configureToolchain ghcProg =
         then return ["-x"]
         else return []
 
-getLanguageExtensions :: Verbosity -> ConfiguredProgram -> IO [(Extension, Flag)]
-getLanguageExtensions verbosity ghcProg
+getLanguages :: Verbosity -> ConfiguredProgram -> IO [(Language, Flag)]
+getLanguages _ ghcProg
+  -- TODO: should be using --supported-languages rather than hard coding
+  | ghcVersion >= Version [7] [] = return [(Haskell98,   "-XHaskell98")
+                                          ,(Haskell2010, "-XHaskell2010")]
+  | otherwise                    = return [(Haskell98,   "")]
+  where
+    Just ghcVersion = programVersion ghcProg
+
+getExtensions :: Verbosity -> ConfiguredProgram -> IO [(Extension, Flag)]
+getExtensions verbosity ghcProg
   | ghcVersion >= Version [6,7] [] = do
 
     exts <- rawSystemStdout verbosity (programPath ghcProg)
diff --git a/Distribution/Simple/Hugs.hs b/Distribution/Simple/Hugs.hs
index 3e5535cd527ec850790f3b4e4ab1db4e80f9456e..5c2757fc8b7e2e8eb491e9365878db260a905963 100644
--- a/Distribution/Simple/Hugs.hs
+++ b/Distribution/Simple/Hugs.hs
@@ -94,7 +94,7 @@ import Distribution.Simple.Utils
          , rawSystemStdInOut
          , die, info, notice )
 import Language.Haskell.Extension
-                                ( Extension(..) )
+         ( Language(Haskell98), Extension(..) )
 import System.FilePath          ( (</>), takeExtension, (<.>),
                                   searchPathSeparator, normalise, takeDirectory )
 import Distribution.System
@@ -134,6 +134,7 @@ configure verbosity hcPath _hcPkgPath conf = do
 
   let comp = Compiler {
         compilerId             = CompilerId Hugs version,
+        compilerLanguages      = hugsLanguages,
         compilerExtensions     = hugsLanguageExtensions
       }
   return (comp, conf'')
@@ -168,6 +169,9 @@ getVersion verbosity hugsPath = do
     months = [ "January", "February", "March", "April", "May", "June", "July"
              , "August", "September", "October", "November", "December" ]
 
+hugsLanguages :: [(Language, Flag)]
+hugsLanguages = [(Haskell98, "")] --default is 98 mode
+
 -- | The flags for the supported extensions
 hugsLanguageExtensions :: [(Extension, Flag)]
 hugsLanguageExtensions =
diff --git a/Distribution/Simple/JHC.hs b/Distribution/Simple/JHC.hs
index 9b355e8912169852dd1ce3d6de0ab4a37852e802..c7dfd6561cf8e567224fdcf44e2bc6822cc33c51 100644
--- a/Distribution/Simple/JHC.hs
+++ b/Distribution/Simple/JHC.hs
@@ -62,8 +62,9 @@ import Distribution.Simple.BuildPaths
                                 ( autogenModulesDir, exeExtension )
 import Distribution.Simple.Compiler
          ( CompilerFlavor(..), CompilerId(..), Compiler(..)
-         , PackageDBStack, Flag, extensionsToFlags )
-import Language.Haskell.Extension (Extension(..))
+         , PackageDBStack, Flag, languageToFlags, extensionsToFlags )
+import Language.Haskell.Extension
+         ( Language(Haskell98), Extension(..))
 import Distribution.Simple.Program
          ( ConfiguredProgram(..), jhcProgram, ProgramConfiguration
          , userMaybeSpecifyPath, requireProgramVersion, lookupProgram
@@ -103,10 +104,14 @@ configure verbosity hcPath _hcPkgPath conf = do
   let Just version = programVersion jhcProg
       comp = Compiler {
         compilerId             = CompilerId JHC version,
+        compilerLanguages      = jhcLanguages,
         compilerExtensions     = jhcLanguageExtensions
       }
   return (comp, conf')
 
+jhcLanguages :: [(Language, Flag)]
+jhcLanguages = [(Haskell98, "")]
+
 -- | The flags for the supported extensions
 jhcLanguageExtensions :: [(Extension, Flag)]
 jhcLanguageExtensions =
diff --git a/Distribution/Simple/LHC.hs b/Distribution/Simple/LHC.hs
index a40b386b90b44d53eac92c34be566d266582a677..019164d86e35d42d2d4f3cd456ed53d3cf96de37 100644
--- a/Distribution/Simple/LHC.hs
+++ b/Distribution/Simple/LHC.hs
@@ -109,7 +109,8 @@ import Distribution.System
 import Distribution.Verbosity
 import Distribution.Text
          ( display, simpleParse )
-import Language.Haskell.Extension (Extension(..))
+import Language.Haskell.Extension
+         ( Language(Haskell98), Extension(..) )
 
 import Control.Monad            ( unless, when )
 import Data.List
@@ -145,11 +146,13 @@ configure verbosity hcPath hcPkgPath conf = do
     ++ programPath lhcProg ++ " is version " ++ display lhcVersion ++ " "
     ++ programPath lhcPkgProg ++ " is version " ++ display lhcPkgVersion
 
-  languageExtensions <- getLanguageExtensions verbosity lhcProg
+  languages  <- getLanguages  verbosity lhcProg
+  extensions <- getExtensions verbosity lhcProg
 
   let comp = Compiler {
         compilerId             = CompilerId LHC lhcVersion,
-        compilerExtensions     = languageExtensions
+        compilerLanguages      = languages,
+        compilerExtensions     = extensions
       }
       conf''' = configureToolchain lhcProg conf'' -- configure gcc and ld
   return (comp, conf''')
@@ -216,8 +219,12 @@ configureToolchain lhcProg =
         then return ["-x"]
         else return []
 
-getLanguageExtensions :: Verbosity -> ConfiguredProgram -> IO [(Extension, Flag)]
-getLanguageExtensions verbosity lhcProg = do
+getLanguages :: Verbosity -> ConfiguredProgram -> IO [(Language, Flag)]
+getLanguages _ _ = return [(Haskell98, "")]
+--FIXME: does lhc support -XHaskell98 flag? from what version?
+
+getExtensions :: Verbosity -> ConfiguredProgram -> IO [(Extension, Flag)]
+getExtensions verbosity lhcProg = do
     exts <- rawSystemStdout verbosity (programPath lhcProg)
               ["--supported-languages"]
     -- GHC has the annoying habit of inverting some of the extensions
diff --git a/Distribution/Simple/NHC.hs b/Distribution/Simple/NHC.hs
index 3fc4d0b6f845a3bb04421358237f422a51f94fa6..987bb912fab8189e9f4b0db9b1e28aeb36b67990 100644
--- a/Distribution/Simple/NHC.hs
+++ b/Distribution/Simple/NHC.hs
@@ -73,7 +73,7 @@ import Distribution.Simple.Compiler
 import qualified Distribution.Simple.PackageIndex as PackageIndex
 import Distribution.Simple.PackageIndex (PackageIndex)
 import Language.Haskell.Extension
-        ( Extension(..) )
+         ( Language(Haskell98), Extension(..) )
 import Distribution.Simple.Program
          ( ProgramConfiguration, userMaybeSpecifyPath, programPath
          , requireProgram, requireProgramVersion, lookupProgram
@@ -130,10 +130,14 @@ configure verbosity hcPath _hcPkgPath conf = do
 
   let comp = Compiler {
         compilerId         = CompilerId NHC nhcVersion,
+        compilerLanguages  = nhcLanguages,
         compilerExtensions = nhcLanguageExtensions
       }
   return (comp, conf'''')
 
+nhcLanguages :: [(Language, Flag)]
+nhcLanguages = [(Haskell98, "-98")]
+
 -- | The flags for the supported extensions
 nhcLanguageExtensions :: [(Extension, Flag)]
 nhcLanguageExtensions =
diff --git a/Distribution/Simple/UHC.hs b/Distribution/Simple/UHC.hs
index 8ad021f9a028aaf5ef45f6f4fcaa3b9761939ed5..024a5e787989ad825383cdd867bd0ef00679daef 100644
--- a/Distribution/Simple/UHC.hs
+++ b/Distribution/Simple/UHC.hs
@@ -84,10 +84,14 @@ configure verbosity hcPath _hcPkgPath conf = do
 
   let comp = Compiler {
                compilerId          =  CompilerId UHC uhcVersion,
+               compilerLanguages   =  uhcLanguages,
                compilerExtensions  =  uhcLanguageExtensions
              }
   return (comp, conf')
 
+uhcLanguages :: [(Language, C.Flag)]
+uhcLanguages = [(Haskell98, "")]
+
 -- | The flags for the supported extensions.
 uhcLanguageExtensions :: [(Extension, C.Flag)]
 uhcLanguageExtensions =