diff --git a/.github/workflows/haskell-ci-dependabot.patch b/.github/workflows/haskell-ci-dependabot.patch
deleted file mode 100644
index 2f4db72c..00000000
--- a/.github/workflows/haskell-ci-dependabot.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-Bump some GitHub Actions versions to prevent Dependabot from opening pull
-requests every time we regenerate the haskell-ci workflow.
-
---- .github/workflows/haskell-ci.yml.orig
-+++ .github/workflows/haskell-ci.yml
-@@ -190,7 +190,7 @@ jobs:
-           chmod a+x $HOME/.cabal/bin/cabal-plan
-           cabal-plan --version
-       - name: checkout
--        uses: actions/checkout@v2
-+        uses: actions/checkout@v3
-         with:
-           path: source
-       - name: autoreconf
-@@ -231,7 +231,7 @@ jobs:
-           $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
-           cabal-plan
-       - name: cache
--        uses: actions/cache@v2
-+        uses: actions/cache@v3
-         with:
-           key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
-           path: ~/.cabal/store
diff --git a/.github/workflows/haskell-ci-hackage.patch b/.github/workflows/haskell-ci-hackage.patch
index 2e551ce9..af350326 100644
--- a/.github/workflows/haskell-ci-hackage.patch
+++ b/.github/workflows/haskell-ci-hackage.patch
@@ -45,16 +45,19 @@ set in GitHub repository secrets.
            - compiler: ghc-8.10.7
              compilerKind: ghc
              compilerVersion: 8.10.7
-@@ -209,8 +217,80 @@
+@@ -237,7 +237,7 @@
            ${CABAL} -vnormal check
        - name: haddock
          run: |
--          $CABAL v2-haddock $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
+-          $CABAL v2-haddock --disable-documentation $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
 +          $CABAL v2-haddock $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH --haddock-for-hackage --builddir $GITHUB_WORKSPACE/haddock all
        - name: unconstrained build
          run: |
            rm -f cabal.project.local
-           $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
+@@ -248,3 +248,75 @@
+         with:
+           key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
+           path: ~/.cabal/store
 +      - name: upload artifacts (sdist)
 +        if: matrix.upload
 +        uses: actions/upload-artifact@v3
diff --git a/.github/workflows/haskell-ci.yml b/.github/workflows/haskell-ci.yml
index 8b76d763..e03f3058 100644
--- a/.github/workflows/haskell-ci.yml
+++ b/.github/workflows/haskell-ci.yml
@@ -8,9 +8,9 @@
 #
 # For more information, see https://github.com/haskell-CI/haskell-ci
 #
-# version: 0.15.202211107
+# version: 0.15.20230312
 #
-# REGENDATA ("0.15.202211107",["github","cabal.project"])
+# REGENDATA ("0.15.20230312",["github","cabal.project"])
 #
 name: Haskell-CI
 on:
@@ -35,6 +35,11 @@ jobs:
     strategy:
       matrix:
         include:
+          - compiler: ghc-9.6.1
+            compilerKind: ghc
+            compilerVersion: 9.6.1
+            setup-method: ghcup
+            allow-failure: false
           - compiler: ghc-9.4.3
             compilerKind: ghc
             compilerVersion: 9.4.3
@@ -77,7 +82,7 @@ jobs:
             curl -sL https://downloads.haskell.org/ghcup/0.1.18.0/x86_64-linux-ghcup-0.1.18.0 > "$HOME/.ghcup/bin/ghcup"
             chmod a+x "$HOME/.ghcup/bin/ghcup"
             "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false)
-            "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
+            "$HOME/.ghcup/bin/ghcup" install cabal 3.10.1.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
             apt-get update
             apt-get install -y libx11-dev libxext-dev libxft-dev libxinerama-dev libxrandr-dev libxss-dev
           else
@@ -87,7 +92,7 @@ jobs:
             mkdir -p "$HOME/.ghcup/bin"
             curl -sL https://downloads.haskell.org/ghcup/0.1.18.0/x86_64-linux-ghcup-0.1.18.0 > "$HOME/.ghcup/bin/ghcup"
             chmod a+x "$HOME/.ghcup/bin/ghcup"
-            "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
+            "$HOME/.ghcup/bin/ghcup" install cabal 3.10.1.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
           fi
         env:
           HCKIND: ${{ matrix.compilerKind }}
@@ -105,13 +110,13 @@ jobs:
             echo "HC=$HC" >> "$GITHUB_ENV"
             echo "HCPKG=$HOME/.ghcup/bin/$HCKIND-pkg-$HCVER" >> "$GITHUB_ENV"
             echo "HADDOCK=$HOME/.ghcup/bin/haddock-$HCVER" >> "$GITHUB_ENV"
-            echo "CABAL=$HOME/.ghcup/bin/cabal-3.6.2.0 -vnormal+nowrap" >> "$GITHUB_ENV"
+            echo "CABAL=$HOME/.ghcup/bin/cabal-3.10.1.0 -vnormal+nowrap" >> "$GITHUB_ENV"
           else
             HC=$HCDIR/bin/$HCKIND
             echo "HC=$HC" >> "$GITHUB_ENV"
             echo "HCPKG=$HCDIR/bin/$HCKIND-pkg" >> "$GITHUB_ENV"
             echo "HADDOCK=$HCDIR/bin/haddock" >> "$GITHUB_ENV"
-            echo "CABAL=$HOME/.ghcup/bin/cabal-3.6.2.0 -vnormal+nowrap" >> "$GITHUB_ENV"
+            echo "CABAL=$HOME/.ghcup/bin/cabal-3.10.1.0 -vnormal+nowrap" >> "$GITHUB_ENV"
           fi
 
           HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
@@ -215,8 +220,8 @@ jobs:
         run: |
           $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
           cabal-plan
-      - name: cache
-        uses: actions/cache@v3
+      - name: restore cache
+        uses: actions/cache/restore@v3
         with:
           key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
           path: ~/.cabal/store
@@ -245,6 +250,12 @@ jobs:
         run: |
           rm -f cabal.project.local
           $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
+      - name: save cache
+        uses: actions/cache/save@v3
+        if: always()
+        with:
+          key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
+          path: ~/.cabal/store
       - name: upload artifacts (sdist)
         if: matrix.upload
         uses: actions/upload-artifact@v3
diff --git a/cabal.haskell-ci b/cabal.haskell-ci
index 9f0b02a9..d70d6e4e 100644
--- a/cabal.haskell-ci
+++ b/cabal.haskell-ci
@@ -7,7 +7,6 @@ apt:
   libxss-dev
 
 github-patches:
-  .github/workflows/haskell-ci-dependabot.patch
   .github/workflows/haskell-ci-hackage.patch
 
 raw-project
diff --git a/xmonad-contrib.cabal b/xmonad-contrib.cabal
index 16a49bc4..db674023 100644
--- a/xmonad-contrib.cabal
+++ b/xmonad-contrib.cabal
@@ -38,7 +38,7 @@ cabal-version:      1.12
 build-type:         Simple
 bug-reports:        https://github.com/xmonad/xmonad-contrib/issues
 
-tested-with:        GHC == 8.6.5 || == 8.8.4 || == 8.10.7 || == 9.0.2 || == 9.2.5 || == 9.4.3
+tested-with:        GHC == 8.6.5 || == 8.8.4 || == 8.10.7 || == 9.0.2 || == 9.2.5 || == 9.4.3 || == 9.6.1
 
 source-repository head
   type:     git