diff --git a/c2hs/c/CAST.hs b/c2hs/c/CAST.hs
--- a/c2hs/c/CAST.hs
+++ b/c2hs/c/CAST.hs
@@ -301,6 +301,7 @@
                | CIntType     Attrs
                | CLongType    Attrs
                | CFloatType   Attrs
+               | CFloat128Type Attrs
                | CDoubleType  Attrs
                | CSignedType  Attrs
                | CUnsigType   Attrs
@@ -324,6 +325,7 @@
   posOf (CIntType       at) = posOf at
   posOf (CLongType      at) = posOf at
   posOf (CFloatType     at) = posOf at
+  posOf (CFloat128Type  at) = posOf at
   posOf (CDoubleType    at) = posOf at
   posOf (CSignedType    at) = posOf at
   posOf (CUnsigType     at) = posOf at
@@ -342,6 +344,7 @@
   (CIntType      at1) == (CIntType      at2) = at1 == at2
   (CLongType     at1) == (CLongType     at2) = at1 == at2
   (CFloatType    at1) == (CFloatType    at2) = at1 == at2
+  (CFloat128Type at1) == (CFloat128Type at2) = at1 == at2
   (CDoubleType   at1) == (CDoubleType   at2) = at1 == at2
   (CSignedType   at1) == (CSignedType   at2) = at1 == at2
   (CUnsigType    at1) == (CUnsigType    at2) = at1 == at2
@@ -1058,6 +1061,9 @@
             putByte bh 13
             put_ bh ar
             put_ bh as
+    put_ bh (CFloat128Type at) = do
+            putByte bh 14
+            put_ bh at
     get bh = do
             h <- getByte bh
             case h of
@@ -1108,6 +1114,9 @@
                     ar <- get bh
                     as <- get bh
                     return (CTypeOfType ar as)
+              14 -> do
+                    at <- get bh
+                    return (CFloat128Type at)
 
 instance Binary CStorageSpec where
     put_ bh (CAuto aa) = do
diff --git a/c2hs/c/CLexer.x b/c2hs/c/CLexer.x
--- a/c2hs/c/CLexer.x
+++ b/c2hs/c/CLexer.x
@@ -111,7 +111,7 @@
 @fractpart = @digits
 @mantpart  = @intpart?\.@fractpart|@intpart\.
 @exppart   = [eE][\+\-]?@digits
-@suffix    = [fFlL]
+@suffix    = [fFlLqQwW]
 
 
 tokens :-
@@ -259,6 +259,7 @@
 idkwtok ('e':'l':'s':'e':[])				     = tok CTokElse
 idkwtok ('e':'n':'u':'m':[])				     = tok CTokEnum
 idkwtok ('e':'x':'t':'e':'r':'n':[])			     = tok CTokExtern
+idkwtok ('_':'_':'f':'l':'o':'a':'t':'1':'2':'8':[])           = tok CTokFloat128
 idkwtok ('f':'l':'o':'a':'t':[])			     = tok CTokFloat
 idkwtok ('f':'o':'r':[])				     = tok CTokFor
 idkwtok ('g':'o':'t':'o':[])				     = tok CTokGoto
diff --git a/c2hs/c/CParser.y b/c2hs/c/CParser.y
--- a/c2hs/c/CParser.y
+++ b/c2hs/c/CParser.y
@@ -191,6 +191,7 @@
 enum		{ CTokEnum	_ }
 extern		{ CTokExtern	_ }
 float		{ CTokFloat	_ }
+"__float128"   { CTokFloat128  _ }
 for		{ CTokFor	_ }
 goto		{ CTokGoto	_ }
 if		{ CTokIf	_ }
@@ -656,6 +657,7 @@
   | int				{% withAttrs $1 $ CIntType }
   | long			{% withAttrs $1 $ CLongType }
   | float			{% withAttrs $1 $ CFloatType }
+  | "__float128"    {% withAttrs $1 $ CFloat128Type }
   | double			{% withAttrs $1 $ CDoubleType }
   | signed			{% withAttrs $1 $ CSignedType }
   | unsigned			{% withAttrs $1 $ CUnsigType }
diff --git a/c2hs/c/CPretty.hs b/c2hs/c/CPretty.hs
--- a/c2hs/c/CPretty.hs
+++ b/c2hs/c/CPretty.hs
@@ -83,6 +83,7 @@
   pretty (CIntType       _) = text "int"
   pretty (CLongType      _) = text "long"
   pretty (CFloatType     _) = text "float"
+  pretty (CFloat128Type  _) = text "__float128"
   pretty (CDoubleType    _) = text "double"
   pretty (CSignedType    _) = text "signed"
   pretty (CUnsigType     _) = text "unsigned"
diff --git a/c2hs/c/CTokens.hs b/c2hs/c/CTokens.hs
--- a/c2hs/c/CTokens.hs
+++ b/c2hs/c/CTokens.hs
@@ -102,6 +102,7 @@
             | CTokEnum     !Position            -- `enum'
             | CTokExtern   !Position            -- `extern'
             | CTokFloat    !Position            -- `float'
+            | CTokFloat128 !Position            -- `__float128'
             | CTokFor      !Position            -- `for'
             | CTokGoto     !Position            -- `goto'
             | CTokIf       !Position            -- `if'
@@ -217,6 +218,7 @@
   posOf (CTokEnum     pos  ) = pos
   posOf (CTokExtern   pos  ) = pos
   posOf (CTokFloat    pos  ) = pos
+  posOf (CTokFloat128 pos  ) = pos
   posOf (CTokFor      pos  ) = pos
   posOf (CTokGoto     pos  ) = pos
   posOf (CTokInt      pos  ) = pos
@@ -311,6 +313,7 @@
   showsPrec _ (CTokEnum     _  ) = showString "enum"
   showsPrec _ (CTokExtern   _  ) = showString "extern"
   showsPrec _ (CTokFloat    _  ) = showString "float"
+  showsPrec _ (CTokFloat128 _  ) = showString "__float128"
   showsPrec _ (CTokFor      _  ) = showString "for"
   showsPrec _ (CTokGoto     _  ) = showString "goto"
   showsPrec _ (CTokIf       _  ) = showString "if"
diff --git a/gtk2hs-buildtools.cabal b/gtk2hs-buildtools.cabal
--- a/gtk2hs-buildtools.cabal
+++ b/gtk2hs-buildtools.cabal
@@ -1,5 +1,5 @@
 Name:   gtk2hs-buildtools
-Version:        0.13.2.2
+Version:        0.13.3.0
 License:        GPL-2
 License-file:   COPYING
 Copyright:      (c) 2001-2010 The Gtk2Hs Team
@@ -40,7 +40,7 @@
         build-depends:   base >= 4 && < 5,
                          process, array, pretty,
                          filepath, random,
-                         Cabal >= 1.24.0.0 && < 1.25,
+                         Cabal >= 1.24.0.0 && < 2.2,
                          filepath >= 1.3.0.0 && < 1.5,
                          directory >= 1.2.0.0 && < 1.4,
                          containers >= 0.5.5.1 && < 0.6
diff --git a/hierarchyGen/Hierarchy.chs.template b/hierarchyGen/Hierarchy.chs.template
--- a/hierarchyGen/Hierarchy.chs.template
+++ b/hierarchyGen/Hierarchy.chs.template
@@ -39,11 +39,13 @@
   ) where
 
 import Foreign.ForeignPtr (ForeignPtr, castForeignPtr)
-#if __GLASGOW_HASKELL__ >= 707
+-- TODO work around cpphs https://ghc.haskell.org/trac/ghc/ticket/13553
+#if __GLASGOW_HASKELL__ >= 707 || __GLASGOW_HASKELL__ == 0
 import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)
 #else
 import Foreign.ForeignPtr (unsafeForeignPtrToPtr)
 #endif
+
 import Foreign.C.Types    (CULong(..), CUInt(..), CULLong(..))
 import System.Glib.GType  (GType, typeInstanceIsA)
 @MODULE_IMPORTS@
diff --git a/src/Gtk2HsSetup.hs b/src/Gtk2HsSetup.hs
--- a/src/Gtk2HsSetup.hs
+++ b/src/Gtk2HsSetup.hs
@@ -26,6 +26,7 @@
                                                libModules, hasLibs)
 import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(withPackageDB, buildDir, localPkgDescr, installedPkgs, withPrograms),
                                            InstallDirs(..),
+                                           ComponentLocalBuildInfo,
                                            componentPackageDeps,
                                            absoluteInstallDirs,
                                            relocatable,
@@ -36,6 +37,12 @@
   rawSystemProgramConf, rawSystemProgramStdoutConf, programName, programPath,
   c2hsProgram, pkgConfigProgram, gccProgram, requireProgram, ghcPkgProgram,
   simpleProgram, lookupProgram, rawSystemProgramStdout, ProgArg)
+#if MIN_VERSION_Cabal(2,0,0)
+import Distribution.Simple.Program.HcPkg ( defaultRegisterOptions )
+import Distribution.Types.PkgconfigDependency ( PkgconfigDependency(..) )
+import Distribution.Types.PkgconfigName
+import qualified Distribution.Types.LocalBuildInfo as LBI (componentsConfigs)  -- TODO will be removed in Cabal 2.2
+#endif
 import Distribution.ModuleName ( ModuleName, components, toFilePath )
 import Distribution.Simple.Utils
 import Distribution.Simple.Setup (CopyFlags(..), InstallFlags(..), CopyDest(..),
@@ -185,8 +192,12 @@
        | modeGenerateRegScript -> die "Generate Reg Script not supported"
        | otherwise             -> do
            setupMessage verbosity "Registering" (packageId pkg)
-           registerPackage verbosity (compiler lbi) (withPrograms lbi) False
-                           packageDbs installedPkgInfo
+           registerPackage verbosity (compiler lbi) (withPrograms lbi)
+#if MIN_VERSION_Cabal(2,0,0)
+             packageDbs installedPkgInfo defaultRegisterOptions
+#else
+             False packageDbs installedPkgInfo
+#endif
 
   where
     modeGenerateRegFile = isJust (flagToMaybe (regGenPkgConf regFlags))
@@ -224,8 +235,13 @@
 -- Processing .chs files with our local c2hs.
 ------------------------------------------------------------------------------
 
+#if MIN_VERSION_Cabal(2,0,0)
+ourC2hs :: BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor
+ourC2hs bi lbi _ = PreProcessor {
+#else
 ourC2hs :: BuildInfo -> LocalBuildInfo -> PreProcessor
 ourC2hs bi lbi = PreProcessor {
+#endif
   platformIndependent = False,
   runPreProcessor = runC2HS bi lbi
 }
@@ -265,16 +281,7 @@
     = nub $
       ["-I" ++ dir | dir <- PD.includeDirs bi]
    ++ [opt | opt@('-':c:_) <- PD.cppOptions bi ++ PD.ccOptions bi, c `elem` "DIU"]
-   ++ ["-D__GLASGOW_HASKELL__="++show (ghcDefine . ghcVersion . compilerId $ LBI.compiler lbi)]
- where
-  ghcDefine (v1:v2:_) = v1 * 100 + v2
-  ghcDefine _ = __GLASGOW_HASKELL__
 
-  ghcVersion :: CompilerId -> [Int]
-  ghcVersion (CompilerId GHCJS v) = drop 3 $ versionBranch v
-  ghcVersion (CompilerId GHC v) = versionBranch v
-  ghcVersion _ = error "Not GHC"
-
 installCHI :: PackageDescription -- ^information from the .cabal file
         -> LocalBuildInfo -- ^information from the configure step
         -> Verbosity -> CopyDest -- ^flags sent to copy or install
@@ -308,7 +315,12 @@
                               tag `isPrefixOf` field,
                               field /= (tag++"file")]
               ++ [ "--tag=" ++ tag
+#if MIN_VERSION_Cabal(2,0,0)
+                 | PackageIdentifier name version <- cPkgs
+                 , let major:minor:_ = versionNumbers version
+#else
                  | PackageIdentifier name (Version (major:minor:_) _) <- cPkgs
+#endif
                  , let name' = filter isAlpha (display name)
                  , tag <- name'
                         :[ name' ++ "-" ++ show maj ++ "." ++ show d2
@@ -339,6 +351,7 @@
       info verb ("Ensuring that callback hooks in "++f++" are up-to-date.")
       genFile hookGen signalsOpts f
 
+#if __GLASGOW_HASKELL__ < 800
   writeFile "gtk2hs_macros.h" $ generateMacros cPkgs
 
 -- Based on Cabal/Distribution/Simple/Build/Macros.hs
@@ -361,6 +374,7 @@
   where fixchar '-' = '_'
         fixchar '.' = '_'
         fixchar c   = c
+#endif
 
 --FIXME: Cabal should tell us the selected pkg-config package versions in the
 --       LocalBuildInfo or equivalent.
@@ -372,8 +386,14 @@
     [ do version <- pkgconfig ["--modversion", display pkgname]
          case simpleParse version of
            Nothing -> die "parsing output of pkg-config --modversion failed"
+#if MIN_VERSION_Cabal(2,0,0)
+           Just v  -> return (PackageIdentifier (mkPackageName $ unPkgconfigName pkgname) v)
+    | PkgconfigDependency pkgname _
+#else
            Just v  -> return (PackageIdentifier pkgname v)
-    | Dependency pkgname _ <- concatMap pkgconfigDepends (allBuildInfo pkg) ]
+    | Dependency pkgname _
+#endif
+    <- concatMap pkgconfigDepends (allBuildInfo pkg) ]
   where
     pkgconfig = rawSystemProgramStdoutConf verbosity
                   pkgConfigProgram (withPrograms lbi)
@@ -486,5 +506,10 @@
 -- We are not going to use this, so reporting the version we will use
 c2hsLocal :: Program
 c2hsLocal = (simpleProgram "gtk2hsC2hs") {
-    programFindVersion = \_ _ -> return . Just $ Version [0,13,13] []
+    programFindVersion = \_ _ -> return . Just $
+#if MIN_VERSION_Cabal(2,0,0)
+      mkVersion [0,13,13]
+#else
+      Version [0,13,13] []
+#endif
   }
