diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# list-tries-0.6.7.1 (2024-09-04)
+* Make tests compile with GHC >= 9.0.
+* Drop support for GHC < 8.10.
+
 # list-tries-0.6.7 (2020-05-12)
 * Updated dependencies and code for GHC 8.8 and 8.10.
 
diff --git a/Data/ListTrie/Base.hs b/Data/ListTrie/Base.hs
--- a/Data/ListTrie/Base.hs
+++ b/Data/ListTrie/Base.hs
@@ -30,7 +30,6 @@
    , showTrieWith
    ) where
 
-import Control.Applicative (Applicative(..), (<$>))
 import Control.Arrow       ((***), first)
 import qualified Data.DList as DL
 import Data.DList          (DList)
diff --git a/Data/ListTrie/Base/Classes.hs b/Data/ListTrie/Base/Classes.hs
--- a/Data/ListTrie/Base/Classes.hs
+++ b/Data/ListTrie/Base/Classes.hs
@@ -9,7 +9,6 @@
 module Data.ListTrie.Base.Classes where
 
 import qualified Control.Applicative as A
-import Control.Applicative (Applicative(..))
 import Control.Monad       (liftM2)
 import Data.Maybe          (fromJust, isJust)
 
diff --git a/Data/ListTrie/Base/Map.hs b/Data/ListTrie/Base/Map.hs
--- a/Data/ListTrie/Base/Map.hs
+++ b/Data/ListTrie/Base/Map.hs
@@ -7,7 +7,6 @@
    , AList, WrappedIntMap
    ) where
 
-import Control.Applicative (pure, (<*>))
 import Control.Arrow       ((***), first, second)
 import Control.Monad       (liftM, liftM2)
 import Data.Foldable       (Foldable(..))
diff --git a/Data/ListTrie/Map.hs b/Data/ListTrie/Map.hs
--- a/Data/ListTrie/Map.hs
+++ b/Data/ListTrie/Map.hs
@@ -36,7 +36,6 @@
 -- key: don't use the latter form of the function unless you need it.
 module Data.ListTrie.Map (MAP_EXPORTS) where
 
-import Control.Applicative ((<*>),(<$>))
 import Control.Arrow       ((***), second)
 import Control.Monad       (liftM2)
 import Data.Binary         (Binary,get,put)
@@ -46,10 +45,8 @@
 import qualified Data.Foldable as F
 import qualified Data.List.NonEmpty as NE
 import qualified Data.Maybe as Maybe
-import Data.Monoid         (Monoid(..))
 import Data.Semigroup      (Semigroup(..), stimesIdempotent)
-import Data.Traversable    (Traversable(traverse))
-import Prelude hiding      (filter, foldl, foldr, lookup, map, null)
+import Prelude hiding      (filter, foldl, foldl', foldr, lookup, map, null)
 import qualified Prelude
 
 #if __GLASGOW_HASKELL__
diff --git a/Data/ListTrie/Patricia/Base.hs b/Data/ListTrie/Patricia/Base.hs
--- a/Data/ListTrie/Patricia/Base.hs
+++ b/Data/ListTrie/Patricia/Base.hs
@@ -31,7 +31,6 @@
    , eqComparePrefixes, ordComparePrefixes
    ) where
 
-import Control.Applicative (Applicative(..), (<$>))
 import Control.Arrow       ((***), first)
 import Control.Exception   (assert)
 import qualified Data.DList as DL
diff --git a/Data/ListTrie/Patricia/Map.hs b/Data/ListTrie/Patricia/Map.hs
--- a/Data/ListTrie/Patricia/Map.hs
+++ b/Data/ListTrie/Patricia/Map.hs
@@ -36,7 +36,6 @@
 -- key: don't use the latter form of the function unless you need it.
 module Data.ListTrie.Patricia.Map (MAP_EXPORTS) where
 
-import Control.Applicative ((<*>),(<$>))
 import Control.Arrow       ((***), second)
 import Control.Monad       (liftM3)
 import Data.Binary         (Binary,get,put)
@@ -46,10 +45,8 @@
 import qualified Data.Foldable as F
 import qualified Data.List.NonEmpty as NE
 import qualified Data.Maybe as Maybe
-import Data.Monoid         (Monoid(..))
 import Data.Semigroup      (Semigroup(..), stimesIdempotent)
-import Data.Traversable    (Traversable(traverse))
-import Prelude hiding      (filter, foldl, foldr, lookup, map, null)
+import Prelude hiding      (filter, foldl, foldl', foldr, lookup, map, null)
 import qualified Prelude
 
 #if __GLASGOW_HASKELL__
diff --git a/Data/ListTrie/Patricia/Set.hs b/Data/ListTrie/Patricia/Set.hs
--- a/Data/ListTrie/Patricia/Set.hs
+++ b/Data/ListTrie/Patricia/Set.hs
@@ -28,9 +28,8 @@
 import Data.Binary    (Binary,get,put)
 import Data.Function  (on)
 import qualified Data.List.NonEmpty as NE
-import Data.Monoid    (Monoid(..))
 import Data.Semigroup (Semigroup(..), stimesIdempotent)
-import Prelude hiding (filter, foldl, foldr, map, null)
+import Prelude hiding (filter, foldl, foldl', foldr, map, null)
 import qualified Prelude
 
 #if __GLASGOW_HASKELL__
diff --git a/Data/ListTrie/Set.hs b/Data/ListTrie/Set.hs
--- a/Data/ListTrie/Set.hs
+++ b/Data/ListTrie/Set.hs
@@ -28,9 +28,8 @@
 import Data.Binary    (Binary,get,put)
 import Data.Function  (on)
 import qualified Data.List.NonEmpty as NE
-import Data.Monoid    (Monoid(..))
 import Data.Semigroup (Semigroup(..), stimesIdempotent)
-import Prelude hiding (filter, foldl, foldr, map, null)
+import Prelude hiding (filter, foldl, foldl', foldr, map, null)
 import qualified Prelude
 
 #if __GLASGOW_HASKELL__
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,3 +1,9 @@
-# list-tries [![Hackage version](https://img.shields.io/hackage/v/list-tries.svg?label=Hackage)](https://hackage.haskell.org/package/list-tries) [![Build Status](https://secure.travis-ci.org/arybczak/list-tries.svg?branch=master)](http://travis-ci.org/arybczak/list-tries)
+# list-tries
+
+[![Build Status](https://github.com/arybczak/list-tries/actions/workflows/haskell-ci.yml/badge.svg?branch=master)](https://github.com/arybczak/list-tries/actions?query=branch%3Amaster)
+[![Hackage](https://img.shields.io/hackage/v/list-tries.svg)](https://hackage.haskell.org/package/list-tries)
+[![Dependencies](https://img.shields.io/hackage-deps/v/list-tries.svg)](https://packdeps.haskellers.com/feed?needle=andrzej@rybczak.net)
+[![Stackage LTS](https://www.stackage.org/package/list-tries/badge/lts)](https://www.stackage.org/lts/package/list-tries)
+[![Stackage Nightly](https://www.stackage.org/package/list-tries/badge/nightly)](https://www.stackage.org/nightly/package/list-tries)
 
 Tries and Patricia tries: finite sets and maps for list keys.
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/list-tries.cabal b/list-tries.cabal
--- a/list-tries.cabal
+++ b/list-tries.cabal
@@ -1,7 +1,6 @@
-Cabal-Version: >= 1.10
-
+Cabal-Version: 3.0
 Name:        list-tries
-Version:     0.6.7
+Version:     0.6.7.1
 Homepage:    http://iki.fi/matti.niemenmaa/list-tries/
 Synopsis:    Tries and Patricia tries: finite sets and maps for list keys
 Category:    Data, Data Structures
@@ -24,14 +23,9 @@
 
 Author:       Matti Niemenmaa
 Maintainer:   Andrzej Rybczak <andrzej@rybczak.net>
-License:      BSD3
+License:      BSD-3-Clause
 License-File: LICENSE.txt
-Tested-With:  GHC == 7.0.4, GHC == 7.2.2, GHC == 7.4.2,
-              GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3,
-              GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.4,
-              GHC == 8.6.3, GHC == 8.8.3, GHC == 8.10.1
-
-Build-Type: Simple
+Tested-With:  GHC == { 8.10.7, 9.0.2, 9.2.8, 9.4.8, 9.6.5, 9.8.2, 9.10.1 }
 
 Extra-Source-Files: README.md
                     CHANGELOG.md
@@ -46,13 +40,12 @@
   location: https://github.com/arybczak/list-tries
 
 Library
-   Build-Depends: base       >= 4.3  && < 5
-                , containers >= 0.4  && < 0.7
-                , dlist      >= 0.4  && < 0.9
+   Build-Depends: base       >= 4.14 && < 5
                 , binary     >= 0.5  && < 0.11
+                , containers >= 0.4  && < 0.8
+                , dlist      >= 0.4  && < 1.1
 
-   if impl(ghc < 8.0)
-      Build-Depends: semigroups >= 0.18 && < 0.19
+   ghc-options: -Wall -Wextra -Wno-dodgy-imports
 
    Exposed-Modules: Data.ListTrie.Base.Map
                     Data.ListTrie.Map
@@ -96,16 +89,19 @@
    hs-source-dirs: tests
    main-is: Main.hs
 
+   if impl(ghc >= 9.8)
+     ghc-options: -Wno-x-partial
+
    Build-Depends: list-tries
-                , base                       >= 4.3 && < 5
-                , binary                     >= 0.5 && < 0.11
-                , template-haskell           >= 2.3 && < 2.17
-                , HUnit                      >= 1.2 && < 1.7
-                , QuickCheck                 >= 2.1 && < 3
-                , test-framework             >= 0.2 && < 1
-                , test-framework-hunit       >= 0.2 && < 1
-                , test-framework-quickcheck2 >= 0.2 && < 1
-                , ChasingBottoms             >= 1.2 && < 1.4
+                , base               < 5
+                , binary
+                , template-haskell   >= 2.16 && < 2.23
+                , HUnit
+                , QuickCheck
+                , test-framework
+                , test-framework-hunit
+                , test-framework-quickcheck2
+                , ChasingBottoms
 
    Other-Modules: Tests.Base
                   Tests.Cases
diff --git a/tests/Tests/TH.hs b/tests/Tests/TH.hs
--- a/tests/Tests/TH.hs
+++ b/tests/Tests/TH.hs
@@ -126,7 +126,11 @@
    expandE m (LetE decs e)        = LetE (map (expandDec m) decs) (expandE m e)
    expandE m (CaseE e matches)    = CaseE (expandE m e)
                                           (map (expandMatch m) matches)
+#if MIN_VERSION_template_haskell(2,17,0)
+   expandE m (DoE mmn stmts)      = DoE mmn (map (expandStmt m) stmts)
+#else
    expandE m (DoE stmts)          = DoE (map (expandStmt m) stmts)
+#endif
    expandE m (CompE stmts)        = CompE (map (expandStmt m) stmts)
    expandE m (SigE e t)           = SigE (expandE m e) (replaceTypes m t)
    expandE m (RecConE name fexps) = RecConE name (map (expandFieldExp m) fexps)
