diff --git a/Cabal.cabal b/Cabal.cabal
--- a/Cabal.cabal
+++ b/Cabal.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.6
 name:          Cabal
-version:       3.16.0.0
+version:       3.16.1.0
 copyright:     2003-2025, Cabal Development Team (see AUTHORS file)
 license:       BSD-3-Clause
 license-file:  LICENSE
@@ -39,7 +39,7 @@
   hs-source-dirs: src
 
   build-depends:
-    , Cabal-syntax ^>= 3.16
+    , Cabal-syntax ^>= 3.16.1.0
     , array      >= 0.4.0.1  && < 0.6
     , base       >= 4.13     && < 5
     , bytestring >= 0.10.0.0 && < 0.13
@@ -49,7 +49,7 @@
     , filepath   >= 1.3.0.1  && < 1.6
     , pretty     >= 1.1.1    && < 1.2
     , process    >= 1.2.1.0  && < 1.7
-    , time       >= 1.4.0.1  && < 1.15
+    , time       >= 1.4.0.1  && < 1.16
 
   if os(windows)
     build-depends:
diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,6 @@
+# 3.16.1.0 [Artem Pelenitsyn](mailto:a@pelenitsyn.top) December 2025
+* See https://github.com/haskell/cabal/blob/master/release-notes/Cabal-3.16.1.0.md
+
 # 3.16.0.0 [Artem Pelenitsyn](mailto:a@pelenitsyn.top) July 2025
 * See https://github.com/haskell/cabal/blob/master/release-notes/Cabal-3.16.0.0.md
 
diff --git a/src/Distribution/Simple/Program/GHC.hs b/src/Distribution/Simple/Program/GHC.hs
--- a/src/Distribution/Simple/Program/GHC.hs
+++ b/src/Distribution/Simple/Program/GHC.hs
@@ -692,6 +692,22 @@
 
           runProgramInvocation verbosity newInvocation
 
+-- Note [Make --interactive the first argument to GHC]
+-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-- The ghc argument @--interactive@ needs to be the first argument to the
+-- ghc invocation, because Haskell Language Server used to rely on this.
+-- This was initially changed for Cabal 3.16, but it broke all existing Haskell
+-- Language Server prebuilt binaries.
+-- To avoid this, we uphold this assumption in Haskell Language Server until the next
+-- Cabal release (3.18).
+--
+-- The solution is to make sure that @--interactive@ is not passed as an argument in
+-- the response file that is usually passed to ghc.
+-- Instead, we filter out @--interactive@ and always pass it as the first argument,
+-- if it exists.
+--
+-- We plan to remove this Hack in Cabal 3.18.
+
 -- Start the repl.  Either use `ghc`, or the program specified by the --with-repl flag.
 runReplProgram
   :: Maybe FilePath
@@ -704,11 +720,23 @@
   -> Maybe (SymbolicPath CWD (Dir Pkg))
   -> GhcOptions
   -> IO ()
-runReplProgram withReplProg tempFileOptions verbosity ghcProg comp platform mbWorkDir ghcOpts =
+runReplProgram withReplProg _tempFileOptions verbosity ghcProg comp platform mbWorkDir ghcOpts =
   let replProg = case withReplProg of
         Just path -> ghcProg{programLocation = FoundOnSystem path}
         Nothing -> ghcProg
-   in runGHCWithResponseFile "ghci.rsp" Nothing tempFileOptions verbosity replProg comp platform mbWorkDir ghcOpts
+   in do
+        -- in runGHCWithResponseFile "ghci.rsp" Nothing tempFileOptions verbosity replProg comp platform mbWorkDir ghcOpts
+        -- See Note [Make --interactive the first argument to GHC]
+        -- In Cabal 3.18, restore the line above.
+        invocation <- ghcInvocation verbosity replProg comp platform mbWorkDir ghcOpts
+        let invocation' =
+              let
+                argsWithoutInteractive = filter (/= "--interactive") (progInvokeArgs invocation)
+               in
+                invocation
+                  { progInvokeArgs = ["--interactive"] <> argsWithoutInteractive
+                  }
+        runProgramInvocation verbosity invocation'
 
 ghcInvocation
   :: Verbosity
