diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,14 @@
 # Revision history for cabal-hoogle
 
+## 3.16.0.0 -- 2026-01-09
+
+* Support Cabal 3.16
+
+## 3.14.0.0 -- 2026-01-02
+
+* Support Cabal 3.14
+* Drop GHC 9.2
+
 ## 3.10.0.0 -- 2024-02-25
 
 * Switch to Cabal 3.10
diff --git a/cabal-hoogle.cabal b/cabal-hoogle.cabal
--- a/cabal-hoogle.cabal
+++ b/cabal-hoogle.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               cabal-hoogle
-version:            3.10.0.0
+version:            3.16.0.0
 synopsis:           generate hoogle database for cabal project and dependencies
 description:
   Please see the README on GitHub at <https://github.com/kokobd/cabal-hoogle>
@@ -23,24 +23,24 @@
 
 library
   build-depends:
-    , base                  >=4.14     && <5
-    , Cabal                 ^>=3.10
-    , cabal-install         ^>=3.10
-    , Cabal-syntax          ^>=3.10
-    , co-log-core           >=0.2      && <0.4
-    , containers            ^>=0.6.2.1
-    , directory             ^>=1.3.6
-    , extra                 ^>=1.7.10
-    , filepath              ^>=1.4.2
+    , base                  >=4.17    && <4.23
+    , Cabal                 >=3.10    && <3.17
+    , cabal-install         >=3.10    && <3.17
+    , Cabal-syntax          >=3.10    && <3.17
+    , co-log-core           >=0.2     && <0.4
+    , containers            >=0.6     && <0.8
+    , directory             ^>=1.3
+    , extra                 >=1.7     && <1.9
+    , filepath              >=1.4.2   && <1.6
     , hoogle                ^>=5.0.18
-    , lens                  >=5        && <6
-    , optparse-applicative  >=0.16     && <1
-    , regex-tdfa            ^>=1.3.1
-    , string-interpolate    ^>=0.3.1.2
-    , text                  ^>=1.2.4   || ^>=2.0
-    , time                  >=1.10     && <2
-    , transformers          ^>=0.5.6   || ^>=0.6
-    , typed-process         ^>=0.2.10
+    , lens                  >=5       && <6
+    , optparse-applicative  >=0.16    && <1
+    , regex-tdfa            ^>=1.3
+    , string-interpolate    ^>=0.3
+    , text                  ^>=1.2.4  || ^>=2.0  || ^>=2.1
+    , time                  >=1.10    && <2
+    , transformers          ^>=0.5.6  || ^>=0.6
+    , typed-process         >=0.2.10  && <0.2.14
 
   default-language:   Haskell2010
   ghc-options:        -Wall
@@ -77,8 +77,8 @@
   build-depends:
     , base
     , cabal-hoogle
-    , silently      ^>=1.2.5.2
-    , tasty         ^>=1.4.2.3
-    , tasty-hunit   ^>=0.10.0.3
+    , silently      ^>=1.2.5
+    , tasty         >=1.4    && <1.6
+    , tasty-hunit   ^>=0.10
 
   build-tool-depends: tasty-discover:tasty-discover
diff --git a/src/Hoogle/Cabal/Command/Common.hs b/src/Hoogle/Cabal/Command/Common.hs
--- a/src/Hoogle/Cabal/Command/Common.hs
+++ b/src/Hoogle/Cabal/Command/Common.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE RecordWildCards #-}
 
 module Hoogle.Cabal.Command.Common
@@ -15,14 +17,21 @@
 import Distribution.Client.DistDirLayout (distDirectory)
 import Distribution.Client.NixStyleOptions
 import Distribution.Client.ProjectOrchestration
+import Distribution.Client.ProjectPlanning.Types (ElaboratedInstallPlan)
 import Distribution.Client.ScriptUtils
 import Distribution.Client.Setup (GlobalFlags, InstallFlags (..), defaultGlobalFlags)
+import Distribution.Client.TargetProblem (TargetProblem)
+import Distribution.Client.Types.SourcePackageDb (SourcePackageDb)
 import Distribution.Simple (OptimisationLevel (NoOptimisation))
-import Distribution.Simple.Setup (ConfigFlags (..), Flag (..), HaddockFlags (..))
+import Distribution.Simple.Setup (ConfigFlags (..), HaddockFlags (..), toFlag)
 import Distribution.Simple.Utils (die')
 import qualified Distribution.Verbosity as Verbosity
 import Options.Applicative
 import System.FilePath ((</>))
+# if MIN_VERSION_Cabal(3,14,0)
+import Distribution.Simple.Setup (CommonSetupFlags (..))
+import Distribution.Utils.Path (makeSymbolicPath)
+#endif
 
 data GlobalOptions = GlobalOptions
   { _globalOptions_builddir :: FilePath,
@@ -61,7 +70,7 @@
   [String] ->
   IO Context
 readContext GlobalOptions {..} targetStrings =
-  withContextAndSelectors RejectNoTargets Nothing flags targetStrings' globalFlags HaddockCommand $ \targetCtx ctx targetSelectors -> do
+  withContextAndSelectors' RejectNoTargets Nothing flags targetStrings' globalFlags HaddockCommand $ \targetCtx ctx targetSelectors -> do
     let targetAction = TargetActionBuild
 
     baseCtx <- case targetCtx of
@@ -69,13 +78,12 @@
       GlobalContext -> return ctx
       ScriptContext path exemeta -> updateContextAndWriteProjectFile ctx path exemeta
 
-    let verbosity = Verbosity.normal
-    buildCtx <- runProjectPreBuildPhase verbosity baseCtx $ \elaboratedPlan -> do
+    buildCtx <- runProjectPreBuildPhase defaultVerbosity baseCtx $ \elaboratedPlan -> do
       -- Interpret the targets on the command line as build targets
       -- (as opposed to say repl or haddock targets).
       targets <-
-        either (reportTargetProblems verbosity "build") return $
-          resolveTargets
+        either (reportTargetProblems defaultVerbosity "build") return $
+          resolveTargets'
             selectPackageTargets
             selectComponentTarget
             elaboratedPlan
@@ -90,7 +98,7 @@
       elaboratedPlan'' <-
         if buildSettingOnlyDeps (buildSettings baseCtx)
           then
-            either (die' verbosity . renderCannotPruneDependencies) return $
+            either (die' defaultVerbosity . renderCannotPruneDependencies) return $
               pruneInstallPlanToDependencies
                 (Map.keysSet targets)
                 elaboratedPlan'
@@ -109,23 +117,84 @@
     defaultFlags = defaultNixStyleFlags defaultBuildFlags
     flags =
       defaultFlags
-        { configFlags =
-            (configFlags defaultFlags)
-              { configOptimization = Flag NoOptimisation,
-                configDistPref = Flag _globalOptions_builddir
-              },
+        { configFlags = setBuildDir _globalOptions_builddir . disableOptimization $ configFlags defaultFlags,
           haddockFlags =
             (haddockFlags defaultFlags)
-              { haddockHoogle = Flag True,
-                haddockHtml = Flag True,
-                haddockLinkedSource = Flag True,
-                haddockQuickJump = Flag True
+              { haddockHoogle = toFlag True,
+                haddockHtml = toFlag True,
+                haddockLinkedSource = toFlag True,
+                haddockQuickJump = toFlag True
               },
           installFlags =
             (installFlags defaultFlags)
-              { installDocumentation = Flag True
+              { installDocumentation = toFlag True
               }
         }
     targetStrings' :: [String]
     targetStrings' = if null targetStrings then ["all"] else targetStrings
     globalFlags = defaultGlobalFlags
+
+disableOptimization :: ConfigFlags -> ConfigFlags
+disableOptimization flags = flags {configOptimization = toFlag NoOptimisation}
+
+setBuildDir :: FilePath -> ConfigFlags -> ConfigFlags
+#if MIN_VERSION_Cabal(3,14,0)
+setBuildDir buildDir flags =
+  flags
+    { configCommonFlags =
+        (configCommonFlags flags)
+          { setupDistPref = toFlag $ makeSymbolicPath buildDir
+          }
+    }
+#else
+setBuildDir buildDir flags =
+  flags { configDistPref = toFlag buildDir }
+#endif
+
+withContextAndSelectors' ::
+  AcceptNoTargets ->
+  Maybe ComponentKind ->
+  NixStyleFlags a ->
+  [String] ->
+  GlobalFlags ->
+  CurrentCommand ->
+  ( TargetContext ->
+    ProjectBaseContext ->
+    [TargetSelector] ->
+    IO b
+  ) ->
+  IO b
+#if MIN_VERSION_Cabal(3,16,0)
+withContextAndSelectors' = withContextAndSelectors defaultVerbosity
+#else
+withContextAndSelectors' = withContextAndSelectors
+#endif
+
+resolveTargets' ::
+  ( forall k.
+    TargetSelector ->
+    [AvailableTarget k] ->
+    Either
+      (TargetProblem err)
+      [k]
+  ) ->
+  ( forall k.
+    SubComponentTarget ->
+    AvailableTarget k ->
+    Either (TargetProblem err) k
+  ) ->
+  ElaboratedInstallPlan ->
+  Maybe SourcePackageDb ->
+  [TargetSelector] ->
+  Either
+    [TargetProblem err]
+    TargetsMap
+#if MIN_VERSION_Cabal(3,16,0)
+-- resolveTargetsFromSolver is a drop-in replacement of resolveTargets. See https://github.com/haskell/cabal/commit/0f1f67cb97dca952123f262e7670a200a783acf4
+resolveTargets' = resolveTargetsFromSolver
+#else
+resolveTargets' = resolveTargets
+#endif
+
+defaultVerbosity :: Verbosity.Verbosity
+defaultVerbosity = Verbosity.normal
diff --git a/src/Hoogle/Cabal/Command/Generate.hs b/src/Hoogle/Cabal/Command/Generate.hs
--- a/src/Hoogle/Cabal/Command/Generate.hs
+++ b/src/Hoogle/Cabal/Command/Generate.hs
@@ -40,6 +40,9 @@
 import Distribution.Simple.Configure (ConfigStateFileError, tryGetPersistBuildConfig)
 import Distribution.Simple.PackageIndex (allPackagesByName)
 import Distribution.Types.LocalBuildInfo (LocalBuildInfo)
+#if MIN_VERSION_Cabal(3,14,0)
+import Distribution.Utils.Path (makeSymbolicPath)
+#endif
 import qualified Distribution.Types.LocalBuildInfo as LocalBuildInfo
 import qualified Distribution.Types.PackageDescription as PackageDescription
 import qualified Distribution.Types.PackageId as PackageId
@@ -126,7 +129,11 @@
 symlinkLocalPackages :: Logger Log -> [FilePath] -> FilePath -> IO [(String, LocalBuildInfo)]
 symlinkLocalPackages logger pkgsPath destDir = do
   fmap catMaybes . forM pkgsPath $ \pkgPath -> runMaybeT $ do
+#if MIN_VERSION_Cabal(3,14,0)
+    lbiEither <- liftIO $ tryGetPersistBuildConfig Nothing (makeSymbolicPath pkgPath)
+#else
     lbiEither <- liftIO $ tryGetPersistBuildConfig pkgPath
+#endif
     lbi <- MaybeT $ case lbiEither of
       Left configStateFileErr -> do
         logWith logger Error $ LogCanNotReadSetupConfig pkgPath configStateFileErr
