diff --git a/rules/build-prog.mk b/rules/build-prog.mk
index f93b99d5f8fc6be39bb253641a235545cc71a8e0..88f1b53960547346bab869fa28f3e392942493dd 100644
--- a/rules/build-prog.mk
+++ b/rules/build-prog.mk
@@ -11,11 +11,7 @@
 # -----------------------------------------------------------------------------
 
 
-# Build a program.  Invoke like this:
-#
-# utils/genapply_MODULES = Main
-# utils/genapply_HC_OPTS = -package Cabal
-# utils/genapply_dist_PROGNAME = genapply
+# Build a program.
 #
 # $(eval $(call build-prog,utils/genapply,dist-install,1))
 
diff --git a/rules/shell-wrapper.mk b/rules/shell-wrapper.mk
index 05dd0eff01c5dba5a7f0e4fdb68b6c79773059d8..ae38e65d34a4bf7f0f2e51d2460255aca1357b69 100644
--- a/rules/shell-wrapper.mk
+++ b/rules/shell-wrapper.mk
@@ -22,15 +22,17 @@ endif
 
 ifeq "$$($1_$2_WANT_INPLACE_WRAPPER)" "YES"
 
+$1_$2_INPLACE_SHELL_WRAPPER_NAME = $$($1_$2_PROG)
+
 ifeq "$$($1_$2_TOPDIR)" "YES"
-INPLACE_WRAPPER = $$(INPLACE_LIB)/$$($1_$2_PROG)
+INPLACE_WRAPPER = $$(INPLACE_LIB)/$$($1_$2_INPLACE_SHELL_WRAPPER_NAME)
 else
-INPLACE_WRAPPER = $$(INPLACE_BIN)/$$($1_$2_PROG)
+INPLACE_WRAPPER = $$(INPLACE_BIN)/$$($1_$2_INPLACE_SHELL_WRAPPER_NAME)
 endif
 
 all_$1_$2 : $$(INPLACE_WRAPPER)
 
-$$(INPLACE_BIN)/$$($1_$2_PROG): WRAPPER=$$@
+$$(INPLACE_WRAPPER): WRAPPER=$$@
 ifeq "$$($1_$2_SHELL_WRAPPER)" "YES"
 $$(INPLACE_WRAPPER): $$($1_$2_SHELL_WRAPPER_NAME)
 endif
diff --git a/utils/runghc/ghc.mk b/utils/runghc/ghc.mk
index 31bf089fabf75cfd23ec486b8b19b23b86c740d1..6979d5022bfe2ab697828b50390edf59f91b03a0 100644
--- a/utils/runghc/ghc.mk
+++ b/utils/runghc/ghc.mk
@@ -19,6 +19,14 @@ utils/runghc_dist-install_INSTALL_INPLACE = YES
 utils/runghc_dist-install_INSTALL_SHELL_WRAPPER_NAME = runghc-$(ProjectVersion)
 utils/runghc_dist-install_EXTRA_HC_OPTS = -cpp -DVERSION="\"$(ProjectVersion)\""
 
+# Be explicit about which version of ghc to call (#9054).
+define utils/runghc_dist-install_INPLACE_SHELL_WRAPPER_EXTRA
+echo 'ghcprog="$(ghc_stage2_INPLACE_SHELL_WRAPPER_NAME)"' >> "$(WRAPPER)"
+endef
+define utils/runghc_dist-install_INSTALL_SHELL_WRAPPER_EXTRA
+echo 'ghcprog="$(ghc_stage$(INSTALL_GHC_STAGE)_INSTALL_SHELL_WRAPPER_NAME)"' >> "$(WRAPPER)"
+endef
+
 ifneq "$(BINDIST)" "YES"
 # hack: the build system has trouble with Main modules not called Main.hs
 utils/runghc/dist-install/build/Main.hs : utils/runghc/runghc.hs | $$(dir $$@)/.
diff --git a/utils/runghc/runghc.wrapper b/utils/runghc/runghc.wrapper
index 9110dccacfdf213b04adff5be1f9f09a283c44dd..5caea0b6c71086ce1170f72df4c157d23df5c9f3 100644
--- a/utils/runghc/runghc.wrapper
+++ b/utils/runghc/runghc.wrapper
@@ -1,3 +1,3 @@
 #!/bin/sh
 
-exec "$executablename" -f "$bindir/ghc" ${1+"$@"}
+exec "$executablename" -f "$bindir/$ghcprog" ${1+"$@"}