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.10.1.0
+Version:             0.10.1.1
 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
@@ -11,13 +11,13 @@
 License:             BSD3
 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-2022
+Maintainer:          Adam Gundry <adam@well-typed.com>
+Copyright:           (c) Iris Connect 2013-2024
 Category:            Network, Web, Cloud, Distributed Computing
 Build-type:          Simple
 Extra-source-files:  changelog
 Cabal-version:       >=1.10
-Tested-with:         GHC == 8.10.7, GHC == 9.2.5, GHC == 9.4.3
+Tested-with:         GHC == 9.4.8, GHC == 9.6.6, GHC == 9.8.2, GHC == 9.10.1
 
 Source-Repository head
   Type:              git
@@ -28,6 +28,11 @@
   Location:          git://github.com/iconnect/api-tools.git
   Tag:               0.10.1.0
 
+flag use-attoparsec-aeson
+  description: Depend on Data.Aeson.Parser from attoparsec-aeson
+  default: True
+  manual: False
+
 Library
   Hs-Source-Dirs:    src
 
@@ -78,31 +83,38 @@
         Text.Regex
 
   Build-depends:
-        QuickCheck           >= 2.5.1    && < 2.15 ,
-        aeson                >= 0.10 && < 1.6 || >= 2.0 && < 2.2  ,
+        QuickCheck           >= 2.5.1    && < 2.16 ,
         aeson-pretty         >= 0.1      && < 0.9  ,
         array                >= 0.4      && < 0.6  ,
         attoparsec           >= 0.10.4   && < 0.15 ,
         base                 >= 4.9      && < 5    ,
         base16-bytestring    >= 0.1      && < 1.1  ,
         base64-bytestring    >= 1.0      && < 1.3  ,
-        bytestring           >= 0.9      && < 0.12 ,
+        bytestring           >= 0.9      && < 0.13 ,
         case-insensitive     >= 1.0      && < 1.3  ,
         cborg                >= 0.1.1.0  && < 0.3  ,
-        containers           >= 0.5      && < 0.7  ,
-        deepseq              >= 1.1      && < 1.5  ,
-        lens                 >= 3.8.7    && < 5.3  ,
+        containers           >= 0.5      && < 0.8  ,
+        deepseq              >= 1.1      && < 1.6  ,
+        lens                 >= 3.8.7    && < 5.4  ,
         regex-base           >= 0.93     && < 0.95 ,
         regex-tdfa           >= 1.1.0    && < 1.4  ,
         safe                 >= 0.3.3    && < 0.4  ,
         safecopy             >= 0.8.1    && < 0.11 ,
         scientific           >= 0.3      && < 0.4  ,
         serialise            >= 0.1.0.0  && < 0.3  ,
-        template-haskell     >= 2.7      && < 2.20 ,
-        text                 >= 0.11.3   && < 2.1  ,
+        template-haskell     >= 2.7      && < 2.23 ,
+        text                 >= 0.11.3   && < 2.2  ,
         time                 >= 1.5.0    && < 1.14 ,
         unordered-containers >= 0.2.3.0  && < 0.3  ,
         vector               >= 0.10.0.1 && < 0.14
+
+  if flag(use-attoparsec-aeson)
+    Build-Depends:
+        aeson                >= 2.2      && < 2.3  ,
+        attoparsec-aeson     >= 2.1      && < 2.3
+  else
+    Build-Depends:
+        aeson                >= 0.10 && < 1.6 || >= 2.0 && < 2.2
 
   Build-tools:
         alex,
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,5 +1,8 @@
 -*-change-log-*-
 
+0.10.1.1 Adam Gundry <adam@well-typed.com> August 2024
+	* Relax dependency bounds and support building on GHC 9.4 through to 9.10
+
 0.10.1.0 Adam Gundry <adam@well-typed.com> March 2023
 	* Fix a space leak in CBOR encoding
 	* Add traversalsTool to Data.API.Tools.Traversal
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
@@ -3,7 +3,9 @@
 
 import Language.Haskell.TH
 
-#if MIN_VERSION_template_haskell(2,17,0)
+#if MIN_VERSION_template_haskell(2,21,0)
+type TyVarBndr' = TyVarBndr BndrVis
+#elif MIN_VERSION_template_haskell(2,17,0)
 type TyVarBndr' = TyVarBndr ()
 #else
 type TyVarBndr' = TyVarBndr
diff --git a/tests/Data/API/Test/JSON.hs b/tests/Data/API/Test/JSON.hs
--- a/tests/Data/API/Test/JSON.hs
+++ b/tests/Data/API/Test/JSON.hs
@@ -66,7 +66,9 @@
 -- | Test that the correct errors are generated for bad JSON data
 errorDecoding :: [TestTree]
 errorDecoding = [ help "not enough input" ""         (proxy :: Int)
-#if MIN_VERSION_aeson(0,10,0)
+#if MIN_VERSION_aeson(2,2,0)
+                      [(SyntaxError "Unexpected end-of-input, expecting JSON value", [])]
+#elif MIN_VERSION_aeson(0,10,0)
                       [(SyntaxError "Error in $: not enough input", [])]
 #else
                       [(SyntaxError "not enough input", [])]
