diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,8 @@
+# 0.0.0.8
+
+Loosen the bound on `containers`.
+
+
 # 0.0.0.7
 
 Fix more broken builds 😬
diff --git a/semilattices.cabal b/semilattices.cabal
--- a/semilattices.cabal
+++ b/semilattices.cabal
@@ -1,18 +1,19 @@
+cabal-version:       3.0
+
 name:                semilattices
-version:             0.0.0.7
+version:             0.0.0.8
 synopsis:            Semilattices
 description:         Join- and meet-semilattices, with optional upper and lower bounds, and a variety of instances for each.
 homepage:            https://github.com/robrix/semilattices
-license:             BSD3
+license:             BSD-3-Clause
 license-file:        LICENSE
 author:              Rob Rix
 maintainer:          rob.rix@me.com
 copyright:           2017-2024 Rob Rix
 category:            Algebra, Data, Data Structures, Math
 build-type:          Simple
-cabal-version:       >=1.10
 
-extra-source-files:
+extra-doc-files:
   README.md
   ChangeLog.md
 
@@ -22,21 +23,8 @@
   GHC   == 8.8.1
   GHCJS == 8.4.0
 
-library
-  exposed-modules:
-    Data.Semilattice.Bound
-    Data.Semilattice.Join
-    Data.Semilattice.Lower
-    Data.Semilattice.Meet
-    Data.Semilattice.Order
-    Data.Semilattice.Tumble
-    Data.Semilattice.Upper
-  build-depends:
-      base >=4.9 && <5
-    , containers >=0.5 && <0.7
-    , unordered-containers >=0.2.20 && <0.3
-  hs-source-dirs:      src
-  default-language:    Haskell2010
+common common
+  default-language: Haskell2010
   ghc-options:
     -Weverything
     -Wno-all-missed-specialisations
@@ -53,20 +41,45 @@
   if (impl(ghc >= 8.8))
     ghc-options: -Wno-missing-deriving-strategies
   if (impl(ghc >= 8.10))
-    ghc-options: -Wno-missing-safe-haskell-mode
+    ghc-options:
+      -Wno-missing-safe-haskell-mode
+      -Wno-prepositive-qualified-module
   if (impl(ghc >= 9.2))
-    ghc-options: -Wno-missing-kind-signatures
+    ghc-options:
+      -Wno-missing-kind-signatures
   -- recent unordered-containers versions don't require Hashable for unionWith.
   if (impl(ghc >= 9.4))
     ghc-options: -Wno-redundant-constraints
+  if (impl(ghc >= 9.8))
+    ghc-options:
+      -Wno-missing-role-annotations
+      -Wno-term-variable-capture
 
+library
+  import: common
+  exposed-modules:
+    Data.Semilattice.Bound
+    Data.Semilattice.Join
+    Data.Semilattice.Lower
+    Data.Semilattice.Meet
+    Data.Semilattice.Order
+    Data.Semilattice.Tumble
+    Data.Semilattice.Upper
+  build-depends:
+    , base >=4.9 && <5
+    , containers >=0.5 && <0.8
+    , unordered-containers >=0.2.20 && <0.3
+  hs-source-dirs:      src
+  default-language:    Haskell2010
+
 test-suite doctests
+  import:              common
   type:                exitcode-stdio-1.0
   hs-source-dirs:      test
   main-is:             Doctests.hs
   default-language:    Haskell2010
   build-depends:
-      base
+    , base >= 4.9 && < 5
     , doctest >= 0.7 && < 1.0
     , QuickCheck >= 2.7 && < 3
     , quickcheck-instances == 0.3.*
diff --git a/test/Doctests.hs b/test/Doctests.hs
--- a/test/Doctests.hs
+++ b/test/Doctests.hs
@@ -4,6 +4,8 @@
 
 import System.Environment
 import Test.DocTest
+import Test.QuickCheck () -- NB: Workaround for a bug in ghc 9.8 CI
+import Test.QuickCheck.Instances ()
 
 main :: IO ()
 main = do
