diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,4 @@
+- 0.6.0.6: Support GHC 8.4
 - 0.6.0.5: Update readme
 - 0.6.0.4: Remove QuickCheck dependency
 - 0.6.0.3: Remove cryptohash dependencies
diff --git a/inline-c.cabal b/inline-c.cabal
--- a/inline-c.cabal
+++ b/inline-c.cabal
@@ -1,5 +1,5 @@
 name:                inline-c
-version:             0.6.0.5
+version:             0.6.0.6
 synopsis:            Write Haskell source files including C code inline. No FFI required.
 description:         See <https://github.com/fpco/inline-c/blob/master/README.md>.
 license:             MIT
@@ -33,7 +33,7 @@
   other-modules:       Language.C.Inline.FunPtr
   ghc-options:         -Wall
   build-depends:       base >=4.7 && <5
-                     , ansi-wl-pprint
+                     , ansi-wl-pprint >= 0.6.8
                      , bytestring
                      , containers
                      , hashable
diff --git a/src/Language/C/Inline/Context.hs b/src/Language/C/Inline/Context.hs
--- a/src/Language/C/Inline/Context.hs
+++ b/src/Language/C/Inline/Context.hs
@@ -51,7 +51,6 @@
 import           Data.Coerce
 import           Data.Int (Int8, Int16, Int32, Int64)
 import qualified Data.Map as Map
-import           Data.Monoid ((<>))
 import           Data.Typeable (Typeable)
 import qualified Data.Vector.Storable as V
 import qualified Data.Vector.Storable.Mutable as VM
@@ -65,6 +64,12 @@
 import qualified Text.Parser.Token as Parser
 import qualified Data.HashSet as HashSet
 
+#if MIN_VERSION_base(4,9,0)
+import           Data.Semigroup (Semigroup, (<>))
+#else
+import           Data.Monoid ((<>))
+#endif
+
 #if __GLASGOW_HASKELL__ < 710
 import           Data.Monoid (Monoid(..))
 import           Data.Traversable (traverse)
@@ -150,6 +155,17 @@
     -- ^ TH.LangC by default
   }
 
+
+#if MIN_VERSION_base(4,9,0)
+instance Semigroup Context where
+  ctx2 <> ctx1 = Context
+    { ctxTypesTable = ctxTypesTable ctx1 <> ctxTypesTable ctx2
+    , ctxAntiQuoters = ctxAntiQuoters ctx1 <> ctxAntiQuoters ctx2
+    , ctxOutput = ctxOutput ctx1 <|> ctxOutput ctx2
+    , ctxForeignSrcLang = ctxForeignSrcLang ctx1 <|> ctxForeignSrcLang ctx2
+    }
+#endif
+
 instance Monoid Context where
   mempty = Context
     { ctxTypesTable = mempty
@@ -158,12 +174,14 @@
     , ctxForeignSrcLang = Nothing
     }
 
+#if !MIN_VERSION_base(4,11,0)
   mappend ctx2 ctx1 = Context
     { ctxTypesTable = ctxTypesTable ctx1 <> ctxTypesTable ctx2
     , ctxAntiQuoters = ctxAntiQuoters ctx1 <> ctxAntiQuoters ctx2
     , ctxOutput = ctxOutput ctx1 <|> ctxOutput ctx2
     , ctxForeignSrcLang = ctxForeignSrcLang ctx1 <|> ctxForeignSrcLang ctx2
     }
+#endif
 
 -- | Context useful to work with vanilla C. Used by default.
 --
diff --git a/src/Language/C/Types.hs b/src/Language/C/Types.hs
--- a/src/Language/C/Types.hs
+++ b/src/Language/C/Types.hs
@@ -65,11 +65,16 @@
 import           Control.Monad.State (execState, modify)
 import           Data.List (partition)
 import           Data.Maybe (fromMaybe)
-import           Data.Monoid ((<>))
 import           Data.Typeable (Typeable)
 import           Text.PrettyPrint.ANSI.Leijen ((</>), (<+>))
 import qualified Text.PrettyPrint.ANSI.Leijen as PP
 
+#if MIN_VERSION_base(4,9,0)
+import           Data.Semigroup (Semigroup, (<>))
+#else
+import           Data.Monoid ((<>))
+#endif
+
 #if __GLASGOW_HASKELL__ < 710
 import           Data.Foldable (Foldable)
 import           Data.Functor ((<$>))
@@ -103,11 +108,19 @@
   , functionSpecifiers :: [P.FunctionSpecifier]
   } deriving (Typeable, Show, Eq)
 
+#if MIN_VERSION_base(4,9,0)
+instance Semigroup Specifiers where
+  Specifiers x1 y1 z1 <> Specifiers x2 y2 z2 =
+    Specifiers (x1 ++ x2) (y1 ++ y2) (z1 ++ z2)
+#endif
+
 instance Monoid Specifiers where
   mempty = Specifiers [] [] []
 
+#if !MIN_VERSION_base(4,11,0)
   mappend (Specifiers x1 y1 z1) (Specifiers x2 y2 z2) =
     Specifiers (x1 ++ x2) (y1 ++ y2) (z1 ++ z2)
+#endif
 
 data Type i
   = TypeSpecifier Specifiers TypeSpecifier
diff --git a/test/Language/C/Types/ParseSpec.hs b/test/Language/C/Types/ParseSpec.hs
--- a/test/Language/C/Types/ParseSpec.hs
+++ b/test/Language/C/Types/ParseSpec.hs
@@ -247,7 +247,7 @@
   arbitrary = do
     modIds <- QC.listOf arbitraryModId
     id_ <- QC.oneof [arbitraryConId, arbitraryVarId]
-    if null modIds && HashSet.member id_ haskellReservedWords
+    if HashSet.member id_ haskellReservedWords
       then QC.arbitrary
       else return $ fromString $ intercalate "." $ modIds ++ [id_]
     where
