diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,7 @@
+0.1.3.12 - 2022 Jan 13
 
----
+  - Support GHC 9.0 and 9.2
+  - Tighten dependency version bounds
 
 0.1.3.10 - 2020 Nov 4
 
diff --git a/loc.cabal b/loc.cabal
--- a/loc.cabal
+++ b/loc.cabal
@@ -1,15 +1,18 @@
+cabal-version: 3.0
+
 name: loc
-version: 0.1.3.10
+version: 0.1.3.12
 
 synopsis: Types representing line and column positions and ranges in text files.
 
-description: The package name /loc/ stands for “location” and is also an allusion to the
-             acronym for “lines of code”.
-             .
-             The @Loc@ type represents a caret position in a text file, the @Span@ type
-             is a nonempty range between two @Loc@s, and the @Area@ type is a set of
-             non-touching @Span@s.
+description:
+    The package name /loc/ stands for “location” and is
+    also an allusion to the acronym for “lines of code”.
 
+    The @Loc@ type represents a caret position in a text file,
+    the @Span@ type is a nonempty range between two @Loc@s,
+    and the @Area@ type is a set of non-touching @Span@s.
+
 category: Data Structures
 
 homepage: https://github.com/chris-martin/loc
@@ -21,62 +24,48 @@
 license-file: license.txt
 
 build-type: Simple
-cabal-version: >= 1.10
 
-tested-with:
-    GHC == 8.0.2
-  , GHC == 8.2.2
-  , GHC == 8.4.3
-  , GHC == 8.6.3
-  , GHC == 8.8.1
-  , GHC == 8.10.1
+extra-source-files: example.png example.svg README.md changelog.md
 
-extra-source-files:
-    example.png
-    example.svg
-    README.md
-    changelog.md
+common base
+    default-language: Haskell2010
+    default-extensions: NoImplicitPrelude
+    ghc-options: -Wall
+    build-depends: base >= 4.9 && < 4.17
+    build-depends: containers >= 0.5.7.1 && < 0.7
 
+common test
+    import: base
+    hs-source-dirs: test
+    ghc-options: -threaded
+    build-depends: loc
+
 library
-  default-language: Haskell2010
-  hs-source-dirs: src
-  default-extensions: NoImplicitPrelude
-  ghc-options: -Wall
-  build-depends: base, containers
-  build-depends: base >= 4.9
-  build-depends: base < 4.15
-  exposed-modules:
-      Data.Loc
-      Data.Loc.Area
-      Data.Loc.Exception
-      Data.Loc.Internal.Map
-      Data.Loc.Internal.Prelude
-      Data.Loc.List.OneToTwo
-      Data.Loc.List.ZeroToTwo
-      Data.Loc.Loc
-      Data.Loc.Pos
-      Data.Loc.Span
-      Data.Loc.Types
+    import: base
+    hs-source-dirs: src
+    exposed-modules:
+        Data.Loc
+        Data.Loc.Area
+        Data.Loc.Exception
+        Data.Loc.Internal.Map
+        Data.Loc.Internal.Prelude
+        Data.Loc.List.OneToTwo
+        Data.Loc.List.ZeroToTwo
+        Data.Loc.Loc
+        Data.Loc.Pos
+        Data.Loc.Span
+        Data.Loc.Types
 
 test-suite doctest
-  default-language: Haskell2010
-  type: exitcode-stdio-1.0
-  main-is: doctest.hs
-  hs-source-dirs: test
-  default-extensions: NoImplicitPrelude
-  ghc-options: -Wall -threaded
-  build-depends: base, containers, doctest, loc
-  build-depends: base >= 4.9
-  build-depends: base < 4.15
+    import: test
+    type: exitcode-stdio-1.0
+    main-is: doctest.hs
+    build-depends: doctest >= 0.16 && < 0.21
 
 test-suite hedgehog
-  default-language: Haskell2010
-  type: exitcode-stdio-1.0
-  main-is: hedgehog.hs
-  hs-source-dirs: test loc-test-src
-  default-extensions: NoImplicitPrelude
-  ghc-options: -Wall -threaded
-  build-depends: base, containers, hedgehog, loc
-  build-depends: base >= 4.9
-  build-depends: base < 4.15
-  other-modules: Test.Loc.Hedgehog.Gen
+    import: test
+    type: exitcode-stdio-1.0
+    main-is: hedgehog.hs
+    hs-source-dirs: loc-test-src
+    build-depends: hedgehog ^>= 1.0
+    other-modules: Test.Loc.Hedgehog.Gen
