diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,10 +1,22 @@
 # Changelog for hackage-cli
 
+## 0.1.0.2
+
+_Andreas Abel, 2024-07-02_
+
+- Allow revision of `stability` field
+  (`hackage-server` issue [#1182](https://github.com/haskell/hackage-server/issues/1182)).
+- Print correct revision in `push-cabal --incr-rev`
+  (issue [#66](https://github.com/hackage-trustees/hackage-cli/issues/66)).
+- Fix for `Cabal-3.12.0.0`.
+
+Builds with `Cabal 3.4 - 3.12` and `GHC 8.2 - 9.10`.
+
 ## 0.1.0.1
 
 _Andreas Abel, 2023-02-20_
 
-- Fix for `Cabal-3.9.0.0`
+- Fix for `Cabal-3.9.0.0`.
 
 Builds with `Cabal 3.4 - 3.9` and `GHC 8.2 - 9.6`.
 
@@ -12,11 +24,11 @@
 
 _Andreas Abel, 2023-01-15_
 
-- Skip errors when running `add-bound` on several files.
-  (PR [#42](https://github.com/hackage-trustees/hackage-cli/pull/42))
+- Skip errors when running `add-bound` on several files
+  (PR [#42](https://github.com/hackage-trustees/hackage-cli/pull/42)).
 
-- If no version range is given for a dependency, interpret it as `-any` rather than _none_ (`<0`).
-  (PR [#48](https://github.com/hackage-trustees/hackage-cli/pull/48))
+- If no version range is given for a dependency, interpret it as `-any` rather than _none_ (`<0`)
+  (PR [#48](https://github.com/hackage-trustees/hackage-cli/pull/48)).
 
 Builds with `Cabal 3.4 - 3.8` and `GHC 8.2 - 9.4`.
 
diff --git a/hackage-cli.cabal b/hackage-cli.cabal
--- a/hackage-cli.cabal
+++ b/hackage-cli.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.4
 name:                hackage-cli
-version:             0.1.0.1
+version:             0.1.0.2
 
 synopsis:            CLI tool for Hackage
 description:
@@ -18,9 +18,11 @@
 -- Supported GHC versions when building with cabal:
 tested-with:
   -- Keep in descending order.
-  GHC == 9.6.0
-  GHC == 9.4.4
-  GHC == 9.2.5
+  GHC == 9.10.1
+  GHC == 9.8.2
+  GHC == 9.6.5
+  GHC == 9.4.8
+  GHC == 9.2.8
   GHC == 9.0.2
   GHC == 8.10.7
   GHC == 8.8.4
@@ -28,16 +30,16 @@
   GHC == 8.4.4
   GHC == 8.2.2
 
-extra-source-files:
+extra-doc-files:
   CHANGELOG.md
   README.md
+
+extra-source-files:
   fixtures/*.diff
   fixtures/*.cabal
   -- Supported GHC versions when building with stack:
-  stack-9.4.4.yaml
-  stack-9.2.5.yaml
-  stack-9.0.2.yaml
-  stack-8.10.7.yaml
+  stack-9.8.yaml
+  stack-9.6.yaml
 
 source-repository head
   Type:     git
@@ -50,10 +52,10 @@
   ghc-options:         -Wall -Wcompat
 
   build-depends:
-    , base         >= 4.10.0.0 && < 4.19
-    , bytestring   >= 0.10.4.0 && < 0.12
-    , Cabal        >= 3.4      && < 3.11
-    , containers   >= 0.5.0.0  && < 0.7
+    , base         >= 4.10.0.0 && < 5
+    , bytestring   >= 0.10.4.0 && < 0.13
+    , Cabal        >= 3.4      && < 3.13
+    , containers   >= 0.5.0.0  && < 0.8
     , mtl          >= 2.2.2    && < 2.3   || >= 2.3.1 && < 2.4
     , pretty      ^>= 1.1.2
 
@@ -71,10 +73,10 @@
     , bytestring
     , Cabal
     , cabal-revisions
-    , tasty         >= 1.0      && < 1.5
+    , tasty         >= 1.0      && < 1.6
         -- tasty-1.0 for stack-8.2.2.yaml
     , tasty-golden ^>= 2.3.2
-    , filepath     ^>= 1.4.0.0
+    , filepath      >= 1.4.0.0  && < 1.6
 
 executable hackage-cli
   default-language:    Haskell2010
@@ -109,26 +111,28 @@
     , mtl
 
   build-depends:
-    , aeson                  >= 1.2.4.0 && < 2.2
+    , aeson                  >= 1.2.4.0  && < 2.3
         -- aeson-1.2.4.0 for stack-8.2.2.yaml
-    , deepseq               ^>= 1.4.0.0
+    , base-compat            >= 0.13.0   && < 1
+        -- base-compat for applyWhen (added to base in 4.18)
+    , deepseq               ^>= 1.4.0.0 || ^>= 1.5.0.0
     , directory             ^>= 1.2.0.1 || ^>= 1.3.0.0
-    , filepath              ^>= 1.4.0.0
+    , filepath               >= 1.4.0.0  && < 2
     , http-io-streams       ^>= 0.1.0.0
     , io-streams            ^>= 1.5.0.1
     , microlens              >= 0.4.8.3  && < 4.13
     , microlens-mtl          >= 0.1.11.1 && < 0.3
     , microlens-th           >= 0.4.1.3  && < 0.5
     , netrc                 ^>= 0.2.0.0
-    , optparse-applicative   >= 0.14    && < 0.18
+    , optparse-applicative   >= 0.14     && < 0.19
     , process-extras        ^>= 0.7.4
-    , semigroups             >= 0.18.3  && < 0.21
+    , semigroups             >= 0.18.3   && < 0.21
     , stringsearch          ^>= 0.3.6
     , tagsoup               ^>= 0.14
-    , tar                   ^>= 0.5
-    , text                   >= 1.2     && < 2.1
-    , time                   >= 1.5.0.1 && < 1.13
+    , tar                    >= 0.5      && < 1
+    , text                   >= 1.2      && < 2.2
+    , time                   >= 1.5.0.1  && < 1.15
     , unordered-containers  ^>= 0.2.7
-    , zlib                  ^>= 0.6.1
+    , zlib                   >= 0.6.1    && < 0.8
 
   ghc-options: -Wall -Wcompat -threaded
diff --git a/lib/Distribution/Server/Util/CabalRevisions.hs b/lib/Distribution/Server/Util/CabalRevisions.hs
--- a/lib/Distribution/Server/Util/CabalRevisions.hs
+++ b/lib/Distribution/Server/Util/CabalRevisions.hs
@@ -12,7 +12,7 @@
 -- Copyright   :  Duncan Coutts et al.
 -- SPDX-License-Identifier: BSD-3-Clause
 --
--- Maintainer  :  libraries@haskell.org
+-- Maintainer  :  Andreas Abel
 -- Stability   :  provisional
 -- Portability :  portable
 --
@@ -178,8 +178,15 @@
 
     checkPackageChecks :: Check GenericPackageDescription
     checkPackageChecks pkg pkg' =
-      let checks  = checkPackage pkg  Nothing
-          checks' = checkPackage pkg' Nothing
+      let checks  = checkPackage pkg
+-- The API change of checkPackage happened somewhere between 3.10 and 3.12.
+#if !MIN_VERSION_Cabal(3,12,0)
+                      Nothing
+#endif
+          checks' = checkPackage pkg'
+#if !MIN_VERSION_Cabal(3,12,0)
+                      Nothing
+#endif
        in case checks' \\ checks of
             []        -> return ()
             newchecks -> fail $ unlines (map ppPackageCheck newchecks)
@@ -341,8 +348,7 @@
   changesOk "copyright"  fromShortText copyrightA copyrightB
   changesOk "maintainer" fromShortText maintainerA maintainerB
   changesOk "author"     fromShortText authorA authorB
-  checkSame "The stability field is unused, don't bother changing it."
-            stabilityA stabilityB
+  changesOk "stability"  fromShortText stabilityA stabilityB
   changesOk' Trivial "tested-with" (show . ppTestedWith) testedWithA testedWithB
   changesOk "homepage" fromShortText homepageA homepageB
   checkSame "The package-url field is unused, don't bother changing it."
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -31,6 +31,7 @@
 import qualified Data.ByteString.Search                 as BSS
 import           Data.Char                              (isSpace)
 import           Data.Foldable                          (toList)
+import           Data.Function.Compat                   (applyWhen)
 import qualified Data.List                              as List
 import           Data.Maybe
 import           Data.Time.Clock.POSIX                  (getPOSIXTime)
@@ -735,18 +736,18 @@
            putStrLn $ "Using Hackage credentials for username " ++ show username
 
            forM_ optPsCFiles $ \fn -> do
-               (pkgn,pkgv,xrev) <- pkgDescToPkgIdXrev <$> C.readGenericPackageDescription C.deafening fn
+               (pkgn, pkgv, xrev0) <- pkgDescToPkgIdXrev <$> C.readGenericPackageDescription C.deafening fn
+               let xrev = applyWhen optPsCIncrRev (+1) xrev0
+
                putStrLn $ concat [ "Pushing ", show fn
                                  , " (", BS8.unpack pkgn, "-", BS8.unpack pkgv, "~", show xrev, ")"
                                  , if not optPsCPublish then " [review-mode]" else "", " ..."
                                  ]
 
-               let editCab | optPsCIncrRev = cabalEditXRev (xrev+1)
-                           | otherwise    = id
-
-               rawcab <- editCab <$> BS.readFile fn
-               (dt,tmp) <- timeIt $ runHConn (hackagePostCabal (username,password) (pkgn,pkgv) rawcab
-                                                               (if optPsCPublish then WetRun else DryRun))
+               rawcab <- applyWhen optPsCIncrRev (cabalEditXRev xrev) <$> BS.readFile fn
+               (dt, tmp) <- timeIt $ runHConn $
+                 hackagePostCabal (username, password) (pkgn, pkgv) rawcab $
+                   if optPsCPublish then WetRun else DryRun
 
                printf "Hackage response was (after %.3f secs):\n" dt
                putStrLn (replicate 80 '=')
diff --git a/stack-8.10.7.yaml b/stack-8.10.7.yaml
deleted file mode 100644
--- a/stack-8.10.7.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-resolver: lts-18.28
-compiler: ghc-8.10.7
-compiler-check: match-exact
-
-packages:
-- .
-
-extra-deps:
-- Cabal-3.4.1.0
-- brotli-0.0.0.0
-- brotli-streams-0.0.0.0
-- http-io-streams-0.1.6.0@rev:0
-- netrc-0.2.0.0
-- xor-0.0.1.0
-# For http-io-streams-0.1.6.0@rev:1
-# - base64-bytestring-1.2.1.0
diff --git a/stack-9.0.2.yaml b/stack-9.0.2.yaml
deleted file mode 100644
--- a/stack-9.0.2.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-resolver: lts-19.33
-compiler: ghc-9.0.2
-compiler-check: match-exact
-
-packages:
-- .
diff --git a/stack-9.2.5.yaml b/stack-9.2.5.yaml
deleted file mode 100644
--- a/stack-9.2.5.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-resolver: lts-20.6
-compiler: ghc-9.2.5
-compiler-check: match-exact
diff --git a/stack-9.4.4.yaml b/stack-9.4.4.yaml
deleted file mode 100644
--- a/stack-9.4.4.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-resolver: nightly-2023-01-14
-compiler: ghc-9.4.4
-compiler-check: match-exact
diff --git a/stack-9.6.yaml b/stack-9.6.yaml
new file mode 100644
--- /dev/null
+++ b/stack-9.6.yaml
@@ -0,0 +1,1 @@
+resolver: lts-22.27
diff --git a/stack-9.8.yaml b/stack-9.8.yaml
new file mode 100644
--- /dev/null
+++ b/stack-9.8.yaml
@@ -0,0 +1,1 @@
+resolver: nightly-2024-07-01
