diff --git a/cabal-install/src/Distribution/Client/ProjectBuilding/UnpackedPackage.hs b/cabal-install/src/Distribution/Client/ProjectBuilding/UnpackedPackage.hs
index 065334d5c6e632f4d3222e4753b38178f539c71c..7d9f34a8e8b35a41f05ef75e4c21d1812f2b7683 100644
--- a/cabal-install/src/Distribution/Client/ProjectBuilding/UnpackedPackage.hs
+++ b/cabal-install/src/Distribution/Client/ProjectBuilding/UnpackedPackage.hs
@@ -168,7 +168,7 @@ buildAndRegisterUnpackedPackage
   verbosity
   distDirLayout@DistDirLayout{distTempDirectory}
   maybe_semaphore
-  BuildTimeSettings{buildSettingNumJobs}
+  buildTimeSettings@BuildTimeSettings{buildSettingNumJobs}
   registerLock
   cacheLock
   pkgshared@ElaboratedSharedConfig
@@ -329,6 +329,7 @@ buildAndRegisterUnpackedPackage
           setupHsHaddockFlags
             pkg
             pkgshared
+            buildTimeSettings
             (commonFlags v)
       haddockArgs v =
         flip filterHaddockArgs v $
diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning.hs b/cabal-install/src/Distribution/Client/ProjectPlanning.hs
index f86e1e7bc04acee6c7541479f29fab11e6386d21..ea4fae8ab8caf599420edaa1ed41fa1485a0dc95 100644
--- a/cabal-install/src/Distribution/Client/ProjectPlanning.hs
+++ b/cabal-install/src/Distribution/Client/ProjectPlanning.hs
@@ -4101,41 +4101,46 @@ setupHsRegisterFlags
 setupHsHaddockFlags
   :: ElaboratedConfiguredPackage
   -> ElaboratedSharedConfig
+  -> BuildTimeSettings
   -> Cabal.CommonSetupFlags
   -> Cabal.HaddockFlags
-setupHsHaddockFlags (ElaboratedConfiguredPackage{..}) (ElaboratedSharedConfig{..}) common =
-  Cabal.HaddockFlags
-    { haddockCommonFlags = common
-    , haddockProgramPaths =
-        case lookupProgram haddockProgram pkgConfigCompilerProgs of
-          Nothing -> mempty
-          Just prg ->
-            [
-              ( programName haddockProgram
-              , locationPath (programLocation prg)
-              )
-            ]
-    , haddockProgramArgs = mempty -- unused, set at configure time
-    , haddockHoogle = toFlag elabHaddockHoogle
-    , haddockHtml = toFlag elabHaddockHtml
-    , haddockHtmlLocation = maybe mempty toFlag elabHaddockHtmlLocation
-    , haddockForHackage = toFlag elabHaddockForHackage
-    , haddockForeignLibs = toFlag elabHaddockForeignLibs
-    , haddockExecutables = toFlag elabHaddockExecutables
-    , haddockTestSuites = toFlag elabHaddockTestSuites
-    , haddockBenchmarks = toFlag elabHaddockBenchmarks
-    , haddockInternal = toFlag elabHaddockInternal
-    , haddockCss = maybe mempty toFlag elabHaddockCss
-    , haddockLinkedSource = toFlag elabHaddockLinkedSource
-    , haddockQuickJump = toFlag elabHaddockQuickJump
-    , haddockHscolourCss = maybe mempty toFlag elabHaddockHscolourCss
-    , haddockContents = maybe mempty toFlag elabHaddockContents
-    , haddockKeepTempFiles = mempty -- TODO: from build settings
-    , haddockIndex = maybe mempty toFlag elabHaddockIndex
-    , haddockBaseUrl = maybe mempty toFlag elabHaddockBaseUrl
-    , haddockLib = maybe mempty toFlag elabHaddockLib
-    , haddockOutputDir = maybe mempty toFlag elabHaddockOutputDir
-    }
+setupHsHaddockFlags
+  (ElaboratedConfiguredPackage{..})
+  (ElaboratedSharedConfig{..})
+  (BuildTimeSettings{buildSettingKeepTempFiles = keepTmpFiles})
+  common =
+    Cabal.HaddockFlags
+      { haddockCommonFlags = common
+      , haddockProgramPaths =
+          case lookupProgram haddockProgram pkgConfigCompilerProgs of
+            Nothing -> mempty
+            Just prg ->
+              [
+                ( programName haddockProgram
+                , locationPath (programLocation prg)
+                )
+              ]
+      , haddockProgramArgs = mempty -- unused, set at configure time
+      , haddockHoogle = toFlag elabHaddockHoogle
+      , haddockHtml = toFlag elabHaddockHtml
+      , haddockHtmlLocation = maybe mempty toFlag elabHaddockHtmlLocation
+      , haddockForHackage = toFlag elabHaddockForHackage
+      , haddockForeignLibs = toFlag elabHaddockForeignLibs
+      , haddockExecutables = toFlag elabHaddockExecutables
+      , haddockTestSuites = toFlag elabHaddockTestSuites
+      , haddockBenchmarks = toFlag elabHaddockBenchmarks
+      , haddockInternal = toFlag elabHaddockInternal
+      , haddockCss = maybe mempty toFlag elabHaddockCss
+      , haddockLinkedSource = toFlag elabHaddockLinkedSource
+      , haddockQuickJump = toFlag elabHaddockQuickJump
+      , haddockHscolourCss = maybe mempty toFlag elabHaddockHscolourCss
+      , haddockContents = maybe mempty toFlag elabHaddockContents
+      , haddockKeepTempFiles = toFlag keepTmpFiles
+      , haddockIndex = maybe mempty toFlag elabHaddockIndex
+      , haddockBaseUrl = maybe mempty toFlag elabHaddockBaseUrl
+      , haddockLib = maybe mempty toFlag elabHaddockLib
+      , haddockOutputDir = maybe mempty toFlag elabHaddockOutputDir
+      }
 
 setupHsHaddockArgs :: ElaboratedConfiguredPackage -> [String]
 -- TODO: Does the issue #3335 affects test as well
diff --git a/cabal-testsuite/PackageTests/HaddockKeepsTmps/Simple.hs b/cabal-testsuite/PackageTests/HaddockKeepsTmps/Simple.hs
new file mode 100644
index 0000000000000000000000000000000000000000..df38c448c5ea2b6cacbdea57bf97dce784c24108
--- /dev/null
+++ b/cabal-testsuite/PackageTests/HaddockKeepsTmps/Simple.hs
@@ -0,0 +1,4 @@
+module Simple where
+
+-- | For hiding needles.
+data Haystack = Haystack
diff --git a/cabal-testsuite/PackageTests/HaddockKeepsTmps/cabal.project b/cabal-testsuite/PackageTests/HaddockKeepsTmps/cabal.project
new file mode 100644
index 0000000000000000000000000000000000000000..f45d5a19d3c0e97fe10f600c0863ff768071d5eb
--- /dev/null
+++ b/cabal-testsuite/PackageTests/HaddockKeepsTmps/cabal.project
@@ -0,0 +1,3 @@
+packages: .
+
+haddock-keep-temp-files: true
diff --git a/cabal-testsuite/PackageTests/HaddockKeepsTmps/cabal.test.hs b/cabal-testsuite/PackageTests/HaddockKeepsTmps/cabal.test.hs
new file mode 100644
index 0000000000000000000000000000000000000000..9a3dfe1777bdac3625fb0026687c5a6d233ab028
--- /dev/null
+++ b/cabal-testsuite/PackageTests/HaddockKeepsTmps/cabal.test.hs
@@ -0,0 +1,20 @@
+{-# LANGUAGE LambdaCase #-}
+import Test.Cabal.Prelude
+import Distribution.Verbosity
+import Distribution.Simple.Glob
+import Distribution.Simple.Glob.Internal
+
+-- Test that "cabal haddock" preserves temporary files
+-- We use haddock-keep-temp-file: True in the cabal.project.
+main = cabalTest $ recordMode DoNotRecord $ do
+  skipIfWindows
+
+  cabal "haddock" []
+
+  cwd <- fmap testCurrentDir getTestEnv
+
+  (globMatches <$> liftIO (runDirFileGlob silent Nothing cwd (GlobDirRecursive [WildCard, Literal "response", WildCard, Literal "txt"]))) >>= \case
+    [] -> error "Expecting a response file to exist"
+    (m:_) ->
+      -- Assert the matched response file is not empty.
+      assertFileDoesContain (cwd </> m) "Simple.hs"
diff --git a/cabal-testsuite/PackageTests/HaddockKeepsTmps/my.cabal b/cabal-testsuite/PackageTests/HaddockKeepsTmps/my.cabal
new file mode 100644
index 0000000000000000000000000000000000000000..73cc27d665b53786e92d987dbb89e4c4c01a024b
--- /dev/null
+++ b/cabal-testsuite/PackageTests/HaddockKeepsTmps/my.cabal
@@ -0,0 +1,13 @@
+cabal-version: 3.0
+name: HaddockKeepsTmps
+version: 0.1
+license: BSD-3-Clause
+author: Rodrigo Mesquita
+stability: stable
+category: PackageTests
+build-type: Simple
+
+library
+    default-language: Haskell2010
+    exposed-modules: Simple
+    build-depends: base