diff --git a/.devcontainer/VERSION_MATRIX.md b/.devcontainer/VERSION_MATRIX.md
index 956ac5c51b44314c823a4620c6f992a502bd5717..3a5b1219c43498388dfb4b59a16627e6b5e58178 100644
--- a/.devcontainer/VERSION_MATRIX.md
+++ b/.devcontainer/VERSION_MATRIX.md
@@ -2,19 +2,25 @@
 
 ## Current
 
-| GHC                         | Cabal[^1] | Stack[^1]   | HLS                                                                                             |
-|:----------------------------|:----------|:------------|:----------------------------------------------------------------------------------------------- |
-| latest<br>9.8.2<br>9.8<br>9 | 3.10.3.0  | ≥ 2.13.1    | latest<br>2.8.0.0<br>2.7.0.0<br>2.6.0.0                                                         |
-| 9.8.1                       | 3.10.2.1  | ≥ 2.13.1    | 2.6.0.0<br>2.5.0.0<br>2.4.0.0                                                                   |
-| 9.6.5<br>9.6                | 3.10.3.0  | ≥ 2.13.1    | 2.8.0.0<br>2.7.0.0                                                                              |
-| 9.6.4                       | 3.10.3.0  | ≥ 2.13.1    | 2.7.0.0<br>2.6.0.0                                                                              |
-| 9.6.3                       | 3.10.1.0  | ≥ 2.13.1    | 2.5.0.0<br>2.4.0.0<br>2.3.0.0<br>2.2.0.0                                                        |
-| 9.4.8<br>9.4                | 3.8.1.0   | ≥ 2.13.1    | 2.8.0.0<br>2.7.0.0<br>2.6.0.0<br>2.5.0.0<br>2.4.0.0                                             |
-| 9.4.7                       | 3.8.1.0   | ≥ 2.13.1    | 2.4.0.0<br>2.3.0.0<br>2.2.0.0<br>2.1.0.0<br>2.0.0.1                                             |
-| 9.2.8<br>9.2                | 3.6.2.0   | ≥ 2.13.1    | 2.8.0.0<br>2.7.0.0<br>2.6.0.0<br>2.5.0.0<br>2.4.0.0<br>2.3.0.0<br>2.2.0.0<br>2.1.0.0<br>2.0.0.1 |
+| GHC                           | Cabal[^1] | Stack[^1] | HLS                           |
+|:------------------------------|:----------|:----------|:----------------------------- |
+| latest<br>9.10.1<br>9.10<br>9 | 3.11.0.0  | ≥ 2.13.1  | n/a                           |
+| 9.8.2<br>9.8                  | 3.10.3.0  | ≥ 2.13.1  | 2.8.0.0<br>2.7.0.0<br>2.6.0.0 |
+| 9.6.5<br>9.6                  | 3.10.3.0  | ≥ 2.13.1  | 2.8.0.0<br>2.7.0.0            |
 
 [^1]: built-in version; see [GHC musl > Version Matrix](../VERSION_MATRIX.md)
 
+## Prior
+
+| GHC          | Cabal[^1] | Stack[^1] | HLS                                                                                             |
+|:-------------|:----------|:----------|:----------------------------------------------------------------------------------------------- |
+| 9.8.1        | 3.10.2.1  | ≥ 2.13.1  | 2.6.0.0<br>2.5.0.0<br>2.4.0.0                                                                   |
+| 9.6.4        | 3.10.3.0  | ≥ 2.13.1  | 2.7.0.0<br>2.6.0.0                                                                              |
+| 9.6.3        | 3.10.1.0  | ≥ 2.13.1  | 2.5.0.0<br>2.4.0.0<br>2.3.0.0<br>2.2.0.0                                                        |
+| 9.4.8<br>9.4 | 3.8.1.0   | ≥ 2.13.1  | 2.8.0.0<br>2.7.0.0<br>2.6.0.0<br>2.5.0.0<br>2.4.0.0                                             |
+| 9.4.7        | 3.8.1.0   | ≥ 2.13.1  | 2.4.0.0<br>2.3.0.0<br>2.2.0.0<br>2.1.0.0<br>2.0.0.1                                             |
+| 9.2.8<br>9.2 | 3.6.2.0   | ≥ 2.13.1  | 2.8.0.0<br>2.7.0.0<br>2.6.0.0<br>2.5.0.0<br>2.4.0.0<br>2.3.0.0<br>2.2.0.0<br>2.1.0.0<br>2.0.0.1 |
+
 ## Legacy
 
 | GHC   | Cabal[^1] | Stack[^2]             | HLS                           |
diff --git a/.devcontainer/ghc-9.4/devcontainer.json b/.devcontainer/ghc-9.10/devcontainer.json
similarity index 82%
rename from .devcontainer/ghc-9.4/devcontainer.json
rename to .devcontainer/ghc-9.10/devcontainer.json
index 6b11434a71db2413b9268596e21213070a1be632..c0e15c8d4ba820630b22ab093cd8d260f5aa1637 100644
--- a/.devcontainer/ghc-9.4/devcontainer.json
+++ b/.devcontainer/ghc-9.10/devcontainer.json
@@ -1,11 +1,10 @@
 {
-  "name": "GHC 9.4",
+  "name": "GHC 9.10 (latest)",
   "build": {
     "dockerfile": "../GHC.Dockerfile",
     "context": "..",
     "args": {
-      "GHC_VERSION": "9.4",
-      "HLS_VERSION": "2.8.0.0",
+      "GHC_VERSION": "9.10",
       "USE_ZSH_FOR_ROOT": "unset-to-use-ash",
       "SET_LANG": "C.UTF-8",
       "SET_TZ": ""
@@ -58,13 +57,13 @@
 
   // Set 'remoteUser' to 'root' to connect as root instead.
   "remoteUser": "vscode",
-  "workspaceMount": "source=ghc-musl-ghc-9.4-home-vscode,target=/home/vscode,type=volume",
-  // "workspaceMount": "source=${localWorkspaceFolder}/.devcontainer/bind-mounts/ghc-musl-ghc-9.4-home-vscode,target=/home/vscode,type=bind",
+  "workspaceMount": "source=ghc-musl-ghc-9.10-home-vscode,target=/home/vscode,type=volume",
+  // "workspaceMount": "source=${localWorkspaceFolder}/.devcontainer/bind-mounts/ghc-musl-ghc-9.10-home-vscode,target=/home/vscode,type=bind",
   "workspaceFolder": "/home/vscode",
 
   // "remoteUser": "root",
-  // "workspaceMount": "source=ghc-musl-ghc-9.4-root,target=/root,type=volume",
-  // // "workspaceMount": "source=${localWorkspaceFolder}/.devcontainer/bind-mounts/ghc-musl-ghc-9.4-root,target=/root,type=bind",
+  // "workspaceMount": "source=ghc-musl-ghc-9.10-root,target=/root,type=volume",
+  // // "workspaceMount": "source=${localWorkspaceFolder}/.devcontainer/bind-mounts/ghc-musl-ghc-9.10-root,target=/root,type=bind",
   // "workspaceFolder": "/root",
 
   "remoteEnv": {
diff --git a/.devcontainer/ghc-9.2/devcontainer.json b/.devcontainer/ghc-9.2/devcontainer.json
deleted file mode 100644
index f64aeb9664240b8121d02f7fb8ef586d90a780bd..0000000000000000000000000000000000000000
--- a/.devcontainer/ghc-9.2/devcontainer.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
-  "name": "GHC 9.2 (recommended)",
-  "build": {
-    "dockerfile": "../GHC-legacy.Dockerfile",
-    "context": "..",
-    "args": {
-      "GHC_VERSION": "9.2",
-      "HLS_VERSION": "2.8.0.0",
-      "STACK_VERSION": "2.11.1",
-      "USE_ZSH_FOR_ROOT": "unset-to-use-ash",
-      "SET_LANG": "C.UTF-8",
-      "SET_TZ": ""
-    }
-  },
-
-  "onCreateCommand": "onCreateCommand.sh",
-  "postCreateCommand": "cabal update",
-  "postAttachCommand": "${HOME}/.local/bin/checkForUpdates.sh",
-
-  "features": {
-    "ghcr.io/devcontainers/features/common-utils:2": {
-      "configureZshAsDefaultShell": true,
-      "upgradePackages": false,
-      "username": "vscode",
-      "userUid": "automatic",
-      "userGid": "automatic"
-    }
-  },
-
-  "customizations": {
-    "vscode": {
-      "extensions": [
-        "alefragnani.project-manager",
-        "christian-kohler.path-intellisense",
-        "DavidAnson.vscode-markdownlint",
-        "eamodio.gitlens@11.7.0",
-        "editorconfig.editorconfig",
-        "exiasr.hadolint",
-        "GitHub.vscode-pull-request-github",
-        "GitLab.gitlab-workflow",
-        "haskell.haskell",
-        "mhutchie.git-graph",
-        "mutantdino.resourcemonitor",
-        "piotrpalarz.vscode-gitignore-generator",
-        "redhat.vscode-yaml",
-        "timonwong.shellcheck"
-      ],
-      "settings": {
-        "gitlab.aiAssistedCodeSuggestions.enabled": false,
-        "gitlab.duoChat.enabled": false,
-        "gitlens.showWelcomeOnInstall": false,
-        "gitlens.showWhatsNewAfterUpgrades": false,
-        "haskell.manageHLS": "PATH",
-        "resmon.show.battery": false,
-        "resmon.show.cpufreq": false
-      }
-    }
-  },
-
-  // Set 'remoteUser' to 'root' to connect as root instead.
-  "remoteUser": "vscode",
-  "workspaceMount": "source=ghc-musl-ghc-9.2-home-vscode,target=/home/vscode,type=volume",
-  // "workspaceMount": "source=${localWorkspaceFolder}/.devcontainer/bind-mounts/ghc-musl-ghc-9.2-home-vscode,target=/home/vscode,type=bind",
-  "workspaceFolder": "/home/vscode",
-
-  // "remoteUser": "root",
-  // "workspaceMount": "source=ghc-musl-ghc-9.2-root,target=/root,type=volume",
-  // // "workspaceMount": "source=${localWorkspaceFolder}/.devcontainer/bind-mounts/ghc-musl-ghc-9.2-root,target=/root,type=bind",
-  // "workspaceFolder": "/root",
-
-  "remoteEnv": {
-    // Pip: Install packages to the user site
-    "PIP_USER": "1"
-  }
-}
diff --git a/.devcontainer/ghc-9.6/devcontainer.json b/.devcontainer/ghc-9.6/devcontainer.json
index 736197a3adf00500b4e22bafea3fd1038839c6f2..e489ed3b8a474fb8ba1dbeb4d6fce980d2aac7da 100644
--- a/.devcontainer/ghc-9.6/devcontainer.json
+++ b/.devcontainer/ghc-9.6/devcontainer.json
@@ -1,11 +1,12 @@
 {
-  "name": "GHC 9.6",
+  "name": "GHC 9.6 (recommended)",
   "build": {
     "dockerfile": "../GHC.Dockerfile",
     "context": "..",
     "args": {
       "GHC_VERSION": "9.6",
-      "HLS_VERSION": "2.8.0.0",
+      "HLS_VERSION": "2.7.0.0",
+      "STACK_VERSION": "2.15.5",
       "USE_ZSH_FOR_ROOT": "unset-to-use-ash",
       "SET_LANG": "C.UTF-8",
       "SET_TZ": ""
diff --git a/.devcontainer/ghc-9.8/devcontainer.json b/.devcontainer/ghc-9.8/devcontainer.json
index b35e89095f7596f51bfd3a74e658c1219e918a4d..70cf52895e54f1b80f3aa54d8f116ecff633d80e 100644
--- a/.devcontainer/ghc-9.8/devcontainer.json
+++ b/.devcontainer/ghc-9.8/devcontainer.json
@@ -1,5 +1,5 @@
 {
-  "name": "GHC 9.8 (latest)",
+  "name": "GHC 9.8",
   "build": {
     "dockerfile": "../GHC.Dockerfile",
     "context": "..",
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 3decb8b4f8236556836380826e567748583f5574..9c4108ca93b8a8ecc303db459c95f9f7d3555175 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,12 +1,12 @@
 .env:
   variables:
-    GHC_VERSION: "9.8.2"
-    CABAL_VERSION: "3.10.3.0"
+    GHC_VERSION: "9.10.1"
+    CABAL_VERSION: "3.12.0.0-prerelease"
     STACK_VERSION: "2.15.7"
     HLS_VERSION: "2.8.0.0"
     BUILD_GHC: "true"
-    BUILD_HLS: "true"
-    TAG_VERSION_MAJ_MIN: "true"
+    BUILD_HLS: "false"
+    TAG_VERSION_MAJ_MIN: "false"
     TAG_VERSION_MAJ: "false"
 
 .before-script-build: &before-script-build
diff --git a/README.md b/README.md
index 19d8e617f65b9338800ead26fc74527d402398a9..69193c694bd26c081b306da0e1a7ef0b97839dad 100644
--- a/README.md
+++ b/README.md
@@ -53,8 +53,8 @@ To install docker, follow the instructions for your platform:
 
 ```bash
 docker build \
-  --build-arg GHC_VERSION=9.8.2 \
-  --build-arg CABAL_VERSION=3.10.3.0 \
+  --build-arg GHC_VERSION=9.10.1 \
+  --build-arg CABAL_VERSION=3.12.0.0-prerelease \
   --build-arg STACK_VERSION=2.15.7 \
   -t ghc-musl \
   -f latest.Dockerfile .
diff --git a/VERSION_MATRIX.md b/VERSION_MATRIX.md
index 9f6331f093fc8733a34227218ce2edd55c219081..9cb62647efb3a96628803bd2d89026cdc910df30 100644
--- a/VERSION_MATRIX.md
+++ b/VERSION_MATRIX.md
@@ -4,6 +4,7 @@ Topmost entry = Tag `latest`
 
 | GHC        | Cabal    | Stack      | LLVM | Linux distro |
 |:-----------|:---------|:-----------|:---- |:-------------|
+| 9.10.1     | 3.11.0.0 | 2.15.7     | 18   | Alpine 3.20  |
 | 9.8.2      | 3.10.3.0 | 2.15.7     | 16   | Alpine 3.20  |
 | 9.8.1      | 3.10.2.1 | 2.15.1     | 14   | Alpine 3.19  |
 | 9.6.5      | 3.10.3.0 | 2.15.7     | 16   | Alpine 3.20  |
diff --git a/latest.Dockerfile b/latest.Dockerfile
index 0b90abe94319494c681b0b99a280c56f2da94fe7..7c073f6e979bb0c5c19157556ecb16322a8cadc2 100644
--- a/latest.Dockerfile
+++ b/latest.Dockerfile
@@ -5,7 +5,7 @@ ARG STACK_VERSION
 ARG GHC_VERSION_BUILD=${GHC_VERSION}
 ARG CABAL_VERSION_BUILD=${CABAL_VERSION}
 
-FROM glcr.b-data.ch/ghc/ghc-musl:9.6.5 as bootstrap
+FROM glcr.b-data.ch/ghc/ghc-musl:9.8.2 as bootstrap
 
 RUN apk upgrade --no-cache \
   && apk add --no-cache \
@@ -13,13 +13,14 @@ RUN apk upgrade --no-cache \
     automake \
     binutils-gold \
     build-base \
+    clang18 \
     coreutils \
     cpio \
     curl \
     gnupg \
     linux-headers \
     libffi-dev \
-    llvm14 \
+    llvm18 \
     ncurses-dev \
     perl \
     python3 \
@@ -32,18 +33,23 @@ ARG GHC_VERSION_BUILD
 
 ENV GHC_VERSION=${GHC_VERSION_BUILD}
 
+COPY patches/${GHC_VERSION}.patch /tmp/
+
 RUN cd /tmp \
   && curl -sSLO https://downloads.haskell.org/~ghc/"$GHC_VERSION"/ghc-"$GHC_VERSION"-src.tar.xz \
   && curl -sSLO https://downloads.haskell.org/~ghc/"$GHC_VERSION"/ghc-"$GHC_VERSION"-src.tar.xz.sig \
   && gpg --keyserver hkps://keyserver.ubuntu.com:443 \
-    --receive-keys 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4 || \
+    --receive-keys FFEB7CE81E16A36B3E2DED6F2DE04D4E97DB64AD || \
     gpg --keyserver hkp://keyserver.ubuntu.com:80 \
-    --receive-keys 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4 \
+    --receive-keys FFEB7CE81E16A36B3E2DED6F2DE04D4E97DB64AD \
   && gpg --verify "ghc-$GHC_VERSION-src.tar.xz.sig" "ghc-$GHC_VERSION-src.tar.xz" \
   && tar -xJf "ghc-$GHC_VERSION-src.tar.xz" \
   && cd "ghc-$GHC_VERSION" \
+  # Apply patches
+  && mv "/tmp/$GHC_VERSION.patch" . \
+  && patch -p0 <"$GHC_VERSION.patch" \
   && ./boot.source \
-  && ./configure --disable-ld-override LD=ld.gold \
+  && ./configure \
   ## Use the LLVM backend
   ## Switch llvm-targets from unknown-linux-gnueabihf->alpine-linux
   ## so we can match the llvm vendor string alpine uses
@@ -51,6 +57,8 @@ RUN cd /tmp \
   && sed -i -e 's/unknown-linux-gnueabi/alpine-linux/g' llvm-targets \
   && sed -i -e 's/unknown-linux-gnu/alpine-linux/g' llvm-targets \
   && cabal update \
+  && cabal install alex \
+  && export PATH=/root/.local/bin:$PATH \
   ## See https://unix.stackexchange.com/questions/519092/what-is-the-logic-of-using-nproc-1-in-make-command
   && hadrian/build binary-dist -j"$(($(nproc)+1))" \
     --flavour=perf+llvm+split_sections \
@@ -65,9 +73,9 @@ ENV CABAL_VERSION=${CABAL_VERSION_BUILD}
 ## Build Cabal (the tool) with the GHC bootstrap version
 RUN cabal update \
   ## See https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/libraries/version-history
-  && cabal install "cabal-install-$CABAL_VERSION"
+  && cabal install cabal-install-3.10.3.0
 
-FROM alpine:3.19 as ghc-base
+FROM alpine:3.20 as ghc-base
 
 LABEL org.opencontainers.image.licenses="MIT" \
       org.opencontainers.image.source="https://gitlab.b-data.ch/ghc/ghc-musl" \
@@ -88,6 +96,7 @@ RUN apk add --no-cache \
     bzip2 \
     bzip2-dev \
     bzip2-static \
+    clang18 \
     curl \
     curl-static \
     dpkg \
@@ -97,7 +106,7 @@ RUN apk add --no-cache \
     libcurl \
     libffi \
     libffi-dev \
-    llvm14 \
+    llvm18 \
     ncurses-dev \
     ncurses-static \
     openssl-dev \
@@ -124,7 +133,7 @@ RUN cd /tmp \
   ## Install GHC
   && tar -xJf ghc-"$GHC_VERSION"-*-alpine-linux.tar.xz \
   && cd ghc-"$GHC_VERSION"-*-alpine-linux \
-  && ./configure --disable-ld-override \
+  && ./configure \
   && make install \
   ## Install Stack
   && cd /tmp \
@@ -142,8 +151,14 @@ FROM ghc-stage1 as ghc-stage2
 COPY --from=bootstrap-cabal /root/.local/bin/cabal /usr/local/bin/cabal
 
 ## Rebuild Cabal (the tool) with the GHC target version
-RUN cabal update \
-  && cabal install "cabal-install-$CABAL_VERSION"
+RUN cd /tmp \
+  && curl -sSLO https://github.com/haskell/cabal/archive/refs/tags/cabal-install-v"$CABAL_VERSION".tar.gz \
+  && tar -xzf cabal-install-v"$CABAL_VERSION".tar.gz \
+  && cd cabal-cabal-install-v"$CABAL_VERSION" \
+  && sed -i 's/2024-03-20T08:02:24Z/2024-04-02T17:52:00Z/g' cabal.project.release \
+  && sed -i 's/hashable   >= 1.0      /hashable   >= 1.4.4.0  /g' cabal-install/cabal-install.cabal \
+  && cabal update \
+  && cabal install --project-file=cabal.project.release --allow-newer cabal-install
 
 FROM ghc-stage1 as test
 
diff --git a/patches/9.10.1.patch b/patches/9.10.1.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4dd99388be07dc2e267bb5451ef2c157bd7a50f2
--- /dev/null
+++ b/patches/9.10.1.patch
@@ -0,0 +1,11 @@
+--- configure.ac
++++ configure.ac.patched
+@@ -492,7 +492,7 @@
+ # versions of LLVM simultaneously, but that stopped working around
+ # 3.5/3.6 release of LLVM.
+ LlvmMinVersion=13  # inclusive
+-LlvmMaxVersion=16 # not inclusive
++LlvmMaxVersion=19 # not inclusive
+ AC_SUBST([LlvmMinVersion])
+ AC_SUBST([LlvmMaxVersion])
+