diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index c910e5b00e2d9d9de6a626698d6637bb8d624927..bf943d5ed2238b7b2a12036068239d35a5ad417b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -69,7 +69,7 @@ build:latest-linux-amd64:
       --build-arg GHC_VERSION
       --build-arg CABAL_VERSION
       --build-arg STACK_VERSION
-      --target tester
+      --target test
       -t $CI_APP_REPO:$CI_APP_TAG-linux-amd64
       -t $CI_APP_REPO:$VERSION_MAJ_MIN_PAT-linux-amd64
       -f latest.Dockerfile .
@@ -101,7 +101,7 @@ build:latest-linux-arm64v8:
       --build-arg GHC_VERSION
       --build-arg CABAL_VERSION
       --build-arg STACK_VERSION
-      --target tester
+      --target test
       -t $CI_APP_REPO:$CI_APP_TAG-linux-arm64v8
       -t $CI_APP_REPO:$VERSION_MAJ_MIN_PAT-linux-arm64v8
       -f latest.Dockerfile .
@@ -130,7 +130,7 @@ build:version-linux-amd64:
   script:
     - >
       docker build
-      --target tester
+      --target test
       -t $CI_APP_REPO:$CI_APP_TAG-linux-amd64
       -f prior/$GHC_VERSION.Dockerfile .
     - >
@@ -152,7 +152,7 @@ build:version-linux-arm64v8:
   script:
     - >
       docker build
-      --target tester
+      --target test
       -t $CI_APP_REPO:$CI_APP_TAG-linux-arm64v8
       -f prior/$GHC_VERSION.Dockerfile .
     - >
diff --git a/latest.Dockerfile b/latest.Dockerfile
index 963c2fc2f5af9c0a240ed3b9d9b0ba137fde75ff..bcc2318dd78b41abe6db9d56a2fa0a4f7a6e08ac 100644
--- a/latest.Dockerfile
+++ b/latest.Dockerfile
@@ -44,21 +44,26 @@ RUN cd /tmp \
   && cd "ghc-$GHC_VERSION" \
   && ./boot.source \
   && ./configure --disable-ld-override LD=ld.gold \
-  # Use the LLVM backend
-  # Switch llvm-targets from unknown-linux-gnueabihf->alpine-linux
-  # so we can match the llvm vendor string alpine uses
+  ## Use the LLVM backend
+  ## Switch llvm-targets from unknown-linux-gnueabihf->alpine-linux
+  ## so we can match the llvm vendor string alpine uses
   && sed -i -e 's/unknown-linux-gnueabihf/alpine-linux/g' llvm-targets \
   && 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 \
-  # See https://unix.stackexchange.com/questions/519092/what-is-the-logic-of-using-nproc-1-in-make-command
+  ## 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 \
-    --docs=none \
-  # See https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/libraries/version-history
+    --docs=none
+
+FROM bootstrap as bootstrap-cabal
+
+## 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 --allow-newer --constraint 'Cabal-syntax<3.11' "cabal-install-$CABAL_VERSION"
 
-FROM alpine:3.18 as builder
+FROM alpine:3.18 as ghc-stage1
 
 LABEL org.opencontainers.image.licenses="MIT" \
       org.opencontainers.image.source="https://gitlab.b-data.ch/ghc/ghc-musl" \
@@ -110,10 +115,10 @@ RUN apk add --no-cache \
 COPY --from=bootstrap /tmp/ghc-"$GHC_VERSION"/_build/bindist/ghc-"$GHC_VERSION"-*-alpine-linux.tar.xz /tmp/
 
 RUN cd /tmp \
-  # Fix https://github.com/haskell/cabal/issues/8923
+  ## Fix https://github.com/haskell/cabal/issues/8923
   && PKG_CONFIG_VERSION="$(pkg-config --version)" \
   && if [ "${PKG_CONFIG_VERSION%.*}" = "1.9" ]; then \
-    # Downgrade pkgconf from 1.9.x to 1.8.1
+    ## Downgrade pkgconf from 1.9.x to 1.8.1
     curl -sSLO http://dl-cdn.alpinelinux.org/alpine/v3.16/main/"$(uname -m)"/pkgconf-1.8.1-r0.apk; \
     apk add --no-cache pkgconf-1.8.1-r0.apk; \
   fi \
@@ -132,25 +137,37 @@ RUN cd /tmp \
   ## Clean up
   && rm -rf /tmp/*
 
-## Install Cabal
-COPY --from=bootstrap /root/.local/bin/cabal /usr/local/bin/cabal
+FROM ghc-stage1 as ghc-stage2
 
-FROM builder as tester
+## Install Cabal (the tool) built with the GHC bootstrap version
+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 --allow-newer --constraint 'Cabal-syntax<3.11' "cabal-install-$CABAL_VERSION"
+
+FROM ghc-stage1 as test
 
 WORKDIR /usr/local/src
 
+## Install Cabal (the tool) built with the GHC target version
+COPY --from=ghc-stage2 /root/.local/bin/cabal /usr/local/bin/cabal
+
 COPY Main.hs Main.hs
 
 RUN ghc -static -optl-pthread -optl-static Main.hs \
   && file Main \
   && ./Main \
-  # Test cabal workflow
+  ## Test cabal workflow
   && mkdir cabal-test \
   && cd cabal-test \
   && cabal update \
   && cabal init -n --is-executable -p tester -l MIT \
   && cabal run
 
-FROM builder as final
+FROM ghc-stage1
+
+## Install Cabal (the tool) built with the GHC target version
+COPY --from=ghc-stage2 /root/.local/bin/cabal /usr/local/bin/cabal
 
 CMD ["ghci"]