diff --git a/api-tools.cabal b/api-tools.cabal
--- a/api-tools.cabal
+++ b/api-tools.cabal
@@ -1,5 +1,5 @@
 Name:                api-tools
-Version:             0.8.0.1
+Version:             0.8.0.2
 Synopsis:            DSL for generating API boilerplate and docs
 Description:         api-tools provides a compact DSL for describing an API.
                      It uses Template Haskell to generate the
@@ -12,11 +12,12 @@
 License-file:        LICENSE
 Author:              Chris Dornan <chrisd@irisconnect.co.uk> and Adam Gundry <adam@well-typed.com>
 Maintainer:          Chris Dornan <chrisd@irisconnect.co.uk> and Adam Gundry <adam@well-typed.com>
-Copyright:           (c) Iris Connect 2013-2014
+Copyright:           (c) Iris Connect 2013-2018
 Category:            Network, Web, Cloud, Distributed Computing
 Build-type:          Simple
 Extra-source-files:  changelog
 Cabal-version:       >=1.10
+Tested-with:         GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.2
 
 Source-Repository head
   Type:              git
@@ -25,7 +26,7 @@
 Source-Repository this
   Type:              git
   Location:          git://github.com/iconnect/api-tools.git
-  Tag:               0.8.0.0
+  Tag:               0.8.0.2
 
 flag time15
   default: True
@@ -77,40 +78,43 @@
         Data.API.TH.Compat
 
   Build-depends:
-        Cabal                >= 1.4      && < 2    ,
-        QuickCheck           >= 2.5.1    && < 2.10 ,
-        aeson                >= 0.10     && < 1.3  ,
+        Cabal                >= 1.4      && < 2.5  ,
+        QuickCheck           >= 2.5.1    && < 2.13 ,
+        aeson                >= 0.10     && < 1.5  ,
         aeson-pretty         >= 0.1      && < 0.9  ,
         array                >= 0.4      && < 0.6  ,
         attoparsec           >= 0.10.4   && < 0.14 ,
         base                 >= 4        && < 5    ,
         base16-bytestring    >= 0.1      && < 0.2  ,
         base64-bytestring    >= 1.0      && < 1.1  ,
-        binary,
         bytestring           >= 0.9      && < 0.11 ,
         case-insensitive     >= 1.0      && < 1.3  ,
-        cborg                >= 0.1.1.0  && < 0.2  ,
-        containers           >= 0.5      && < 0.6  ,
+        cborg                >= 0.1.1.0  && < 0.3  ,
+        containers           >= 0.5      && < 0.7  ,
         deepseq              >= 1.1      && < 1.5  ,
-        lens                 >= 3.8.7    && < 4.16 ,
+        lens                 >= 3.8.7    && < 4.18 ,
         regex-compat-tdfa    >= 0.95.1   && < 0.96 ,
         safe                 >= 0.3.3    && < 0.4  ,
         safecopy             >= 0.8.1    && < 0.10 ,
         scientific           >= 0.3      && < 0.4  ,
-        serialise            >= 0.1.0.0  && < 0.2  ,
-        template-haskell     >= 2.7      && < 2.12 ,
+        serialise            >= 0.1.0.0  && < 0.3  ,
+        template-haskell     >= 2.7      && < 2.15 ,
         text                 >= 0.11.3   && < 1.3  ,
         unordered-containers >= 0.2.3.0  && < 0.3  ,
-        vector               >= 0.10.0.1 && < 0.12
+        vector               >= 0.10.0.1 && < 0.13
 
   if flag(time15)
     Build-depends:
-        time                 >= 1.5.0    && < 1.7
+        time                 >= 1.5.0    && < 1.10
   else
     Build-depends:
         old-locale           >= 1        && < 1.1,
         time                 >= 1.1.4    && < 1.5
 
+  if !impl(ghc >= 8.0)
+    -- Needed for Data.Semigroup before it was in base
+    build-depends: semigroups == 0.18.*
+
   Build-tools:
         alex,
         happy
@@ -129,24 +133,10 @@
 
   Build-depends:
         api-tools,
-        QuickCheck           >= 2.5.1    && < 2.10 ,
-        aeson                                      ,
-        aeson-pretty         >= 0.1      && < 0.9  ,
-        array                >= 0.4      && < 0.6  ,
-        attoparsec           >= 0.10.4   && < 0.14 ,
-        base                 >= 4        && < 5    ,
-        base64-bytestring    >= 1.0      && < 1.1  ,
-        bytestring           >= 0.9      && < 0.11 ,
-        case-insensitive     >= 1.0      && < 1.3  ,
-        containers           >= 0.5      && < 0.6  ,
-        lens                 >= 3.8.7    && < 4.16 ,
-        regex-compat-tdfa    >= 0.95.1   && < 0.96 ,
-        safe                 >= 0.3.3    && < 0.4  ,
-        safecopy             >= 0.8.1    && < 0.10 ,
-        template-haskell     >= 2.7      && < 2.12 ,
-        text                 >= 0.11.3   && < 1.3  ,
-        unordered-containers >= 0.2.3.0  && < 0.3  ,
-        vector               >= 0.10.0.1 && < 0.12
+        aeson,
+        aeson-pretty,
+        base,
+        bytestring
 
   GHC-Options:
         -main-is Data.API.MigrationTool
@@ -163,28 +153,11 @@
 
   Build-depends:
         api-tools,
-        QuickCheck           >= 2.5.1    && < 2.10 ,
-        aeson                                      ,
-        aeson-pretty         >= 0.1      && < 0.9  ,
-        array                >= 0.4      && < 0.6  ,
-        attoparsec           >= 0.10.4   && < 0.14 ,
-        base                 >= 4        && < 5    ,
-        base64-bytestring    >= 1.0      && < 1.1  ,
-        bytestring           >= 0.9      && < 0.11 ,
-        case-insensitive     >= 1.0      && < 1.3  ,
-        cborg                >= 0.1.1.0  && < 0.2  ,
-        containers           >= 0.5      && < 0.6  ,
-        deepseq              >= 1.1      && < 1.5  ,
-        lens                 >= 3.8.7    && < 4.16 ,
-        regex-compat-tdfa    >= 0.95.1   && < 0.96 ,
-        safe                 >= 0.3.3    && < 0.4  ,
-        safecopy             >= 0.8.1    && < 0.10 ,
-        serialise            >= 0.1.0.0  && < 0.2  ,
-        template-haskell     >= 2.7      && < 2.12 ,
-        text                 >= 0.11.3   && < 1.3  ,
-        unordered-containers >= 0.2.3.0  && < 0.3  ,
-        vector               >= 0.10.0.1 && < 0.12,
-        time
+        QuickCheck,
+        aeson,
+        base,
+        deepseq,
+        serialise
 
   GHC-Options:
         -main-is Data.API.PerfTest
@@ -211,31 +184,24 @@
 
   Build-depends:
         api-tools,
-        Cabal                >= 1.4      && < 2    ,
-        QuickCheck           >= 2.5.1    && < 2.10 ,
-        aeson                                      ,
-        aeson-pretty         >= 0.1      && < 0.9  ,
-        array                >= 0.4      && < 0.6  ,
-        attoparsec           >= 0.10.4   && < 0.14 ,
-        base                 >= 4        && < 5    ,
-        base64-bytestring    >= 1.0      && < 1.1  ,
-        bytestring           >= 0.9      && < 0.11 ,
-        case-insensitive     >= 1.0      && < 1.3  ,
-        cborg                >= 0.1.1.0  && < 0.2  ,
-        containers           >= 0.5      && < 0.6  ,
-        lens                 >= 3.8.7    && < 4.16 ,
-        regex-compat-tdfa    >= 0.95.1   && < 0.96 ,
-        safe                 >= 0.3.3    && < 0.4  ,
-        safecopy             >= 0.8.1    && < 0.10 ,
-        serialise            >= 0.1.0.0  && < 0.2  ,
-        tasty                >= 0.10.1   && < 0.12 ,
-        tasty-hunit          >= 0.2      && < 10.0 ,
-        tasty-quickcheck     >= 0.3      && < 0.9  ,
+        Cabal,
+        QuickCheck,
+        aeson,
+        aeson-pretty,
+        base,
+        base64-bytestring,
+        bytestring,
+        cborg,
+        containers,
+        safecopy,
+        serialise,
+        tasty                >= 0.10.1   && < 1.2 ,
+        tasty-hunit          >= 0.2      && < 10.0,
+        tasty-quickcheck     >= 0.3      && < 0.11,
         time,
-        template-haskell     >= 2.7      && < 2.12 ,
-        text                 >= 0.11.3   && < 1.3  ,
-        unordered-containers >= 0.2.3.0  && < 0.3  ,
-        vector               >= 0.10.0.1 && < 0.12
+        template-haskell,
+        text,
+        unordered-containers
 
   GHC-Options:
         -main-is Data.API.Test.Main
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,5 +1,8 @@
 -*-change-log-*-
 
+0.8.0.2 Adam Gundry <adam@well-typed.com> November 2018
+	* Relax dependency bounds and support building on GHC 8.4.x and 8.6.x
+
 0.8.0.1 Adam Gundry <adam@well-typed.com> October 2017
 	* Silently truncate floating point numbers to integers
 
diff --git a/src/Data/API/JSON.hs b/src/Data/API/JSON.hs
--- a/src/Data/API/JSON.hs
+++ b/src/Data/API/JSON.hs
@@ -82,7 +82,7 @@
 import           Data.Traversable
 import qualified Data.Vector                    as V
 import           Data.Version
-import           Distribution.Text
+import           Distribution.Text (simpleParse)
 import           Text.Regex
 import           Prelude
 
diff --git a/src/Data/API/TH/Compat.hs b/src/Data/API/TH/Compat.hs
--- a/src/Data/API/TH/Compat.hs
+++ b/src/Data/API/TH/Compat.hs
@@ -5,7 +5,9 @@
 
 mkDataD :: Cxt -> Name -> [TyVarBndr] -> [Con] -> [Name] -> Dec
 mkDataD cxt1 name tyVarBndrs cons drvs =
-#if MIN_VERSION_template_haskell(2,11,0)
+#if MIN_VERSION_template_haskell(2,12,0)
+  DataD cxt1 name tyVarBndrs Nothing cons [DerivClause Nothing (map ConT drvs)]
+#elif MIN_VERSION_template_haskell(2,11,0)
   DataD cxt1 name tyVarBndrs Nothing cons (map ConT drvs)
 #else
   DataD cxt1 name tyVarBndrs cons drvs
@@ -21,7 +23,9 @@
 
 mkNewtypeD :: Cxt -> Name -> [TyVarBndr] -> Con -> [Name] -> Dec
 mkNewtypeD cxt1 name tyVarBndrs cons drvs =
-#if MIN_VERSION_template_haskell(2,11,0)
+#if MIN_VERSION_template_haskell(2,12,0)
+  NewtypeD cxt1 name tyVarBndrs Nothing cons [DerivClause Nothing (map ConT drvs)]
+#elif MIN_VERSION_template_haskell(2,11,0)
   NewtypeD cxt1 name tyVarBndrs Nothing cons (map ConT drvs)
 #else
   NewtypeD cxt1 name tyVarBndrs cons drvs
diff --git a/src/Data/API/Tools/Combinators.hs b/src/Data/API/Tools/Combinators.hs
--- a/src/Data/API/Tools/Combinators.hs
+++ b/src/Data/API/Tools/Combinators.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP                        #-}
 {-# LANGUAGE TemplateHaskell            #-}
 
 module Data.API.Tools.Combinators
@@ -27,6 +28,7 @@
 
 import           Control.Applicative
 import           Data.Monoid
+import           Data.Semigroup as Sem
 import           Language.Haskell.TH
 import           Prelude
 
@@ -61,9 +63,14 @@
 type APITool     = Tool API
 type APINodeTool = Tool APINode
 
+instance Sem.Semigroup (Tool a) where
+  Tool t1 <> Tool t2 = Tool $ \ ts x -> (++) <$> t1 ts x <*> t2 ts x
+
 instance Monoid (Tool a) where
   mempty                    = Tool $ \ _ _ -> return []
+#if !(MIN_VERSION_base(4,11,0))
   Tool t1 `mappend` Tool t2 = Tool $ \ ts x -> (++) <$> t1 ts x <*> t2 ts x
+#endif
 
 -- | Construct a tool that does not depend on any settings
 simpleTool :: (a -> Q [Dec]) -> Tool a
diff --git a/tests/Data/API/Test/Migration.hs b/tests/Data/API/Test/Migration.hs
--- a/tests/Data/API/Test/Migration.hs
+++ b/tests/Data/API/Test/Migration.hs
@@ -29,7 +29,7 @@
 import qualified Data.Text.Encoding       as TE
 import           Data.Version
 import           Test.Tasty               as Test
-import           Test.Tasty.HUnit
+import qualified Test.Tasty.HUnit         as HUnit
 import qualified Test.Tasty.QuickCheck    as QC
 import           Test.QuickCheck.Property as P
 
@@ -130,44 +130,44 @@
                                   testFieldMigration'
 
 
-assertMatchesAPI :: String -> API -> JS.Value -> Assertion
+assertMatchesAPI :: String -> API -> JS.Value -> HUnit.Assertion
 assertMatchesAPI x a v = case dataMatchesAPI root_ a v of
     Right () -> return ()
-    Left err -> assertFailure (x ++ ": " ++ prettyValueErrorPosition err)
+    Left err -> HUnit.assertFailure (x ++ ": " ++ prettyValueErrorPosition err)
 
-basicMigrationTest :: Assertion
+basicMigrationTest :: HUnit.Assertion
 basicMigrationTest = do
     assertMatchesAPI "Start data does not match start API" startSchema startData
     assertMatchesAPI "End data does not match end API"     endSchema   endData
     case migrateDataDump (startSchema, startVersion) (endSchema, DevVersion)
                          changelog testMigration root_ CheckAll startData of
       Right (v, []) | endData == v -> return ()
-                    | otherwise    -> assertFailure $ "expected:\n"
+                    | otherwise    -> HUnit.assertFailure $ "expected:\n"
                                       ++ BL.unpack (JS.encodePretty endData)
                                       ++ "\nbut got:\n"
                                       ++ BL.unpack (JS.encodePretty v)
-      Right (_, ws) -> assertFailure $ "Unexpcted warnings: " ++ show ws
-      Left err      -> assertFailure (prettyMigrateFailure err)
+      Right (_, ws) -> HUnit.assertFailure $ "Unexpcted warnings: " ++ show ws
+      Left err      -> HUnit.assertFailure (prettyMigrateFailure err)
 
 applyFailureTest :: (Version, Version, ApplyFailure) -> Test.TestTree
 applyFailureTest (ver, ver', expected) =
-    testCase (showVersion ver ++ " -> " ++ showVersion ver') $
+    HUnit.testCase (showVersion ver ++ " -> " ++ showVersion ver') $
           case migrateDataDump (startSchema, ver) (endSchema, Release ver')
                                badChangelog testMigration root_ CheckAll startData of
-            Right _ -> assertFailure $ "Successful migration!"
+            Right _ -> HUnit.assertFailure $ "Successful migration!"
             Left (ValidateFailure (ChangelogEntryInvalid _ _ err))
                 | err == expected -> return ()
-            Left err -> assertFailure $ unlines $ ["Unexpected failure:"]
+            Left err -> HUnit.assertFailure $ unlines $ ["Unexpected failure:"]
                         ++ indent (ppLines err) ++ ["Expecting:"]
                         ++ indent (ppLines expected)
 
 migrateFailureTest :: MigrateFailureTest
                     -> Test.TestTree
 migrateFailureTest (s, start, end, clog, db, expected) =
-    testCase s $ case migrateDataDump start end clog testMigration root_ CheckAll db of
-        Right _                 -> assertFailure $ "Successful migration!"
+    HUnit.testCase s $ case migrateDataDump start end clog testMigration root_ CheckAll db of
+        Right _                 -> HUnit.assertFailure $ "Successful migration!"
         Left err | expected err -> return ()
-                 | otherwise    -> assertFailure $ unlines $ ["Unexpected failure:"]
+                 | otherwise    -> HUnit.assertFailure $ unlines $ ["Unexpected failure:"]
                                                              ++ indent (ppLines err)
 
 
@@ -212,9 +212,9 @@
 
 migrationTests :: TestTree
 migrationTests = testGroup "Migration"
-  [ testCase     "Basic migration using sample changelog" basicMigrationTest
-  , testGroup    "Invalid changes"    $ map applyFailureTest   expectedApplyFailures
-  , testGroup    "Invalid migrations" $ map migrateFailureTest expectedMigrateFailures
+  [ HUnit.testCase  "Basic migration using sample changelog" basicMigrationTest
+  , testGroup       "Invalid changes"    $ map applyFailureTest   expectedApplyFailures
+  , testGroup       "Invalid migrations" $ map migrateFailureTest expectedMigrateFailures
   , QC.testProperty "Valid migrations (JSON)" validMigrationProperty
   , QC.testProperty "Valid migrations (generic)" validMigrationProperty'
   ]
