diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # chs-cabal
 
+## 0.1.1.3
+
+  * Update for Cabal 3.14
+
 ## 0.1.1.2
 
   * Update for Cabal 3.12
diff --git a/chs-cabal.cabal b/chs-cabal.cabal
--- a/chs-cabal.cabal
+++ b/chs-cabal.cabal
@@ -1,6 +1,6 @@
 cabal-version:   1.18
 name:            chs-cabal
-version:         0.1.1.2
+version:         0.1.1.3
 license:         BSD3
 license-file:    LICENSE
 copyright:       Copyright: (c) 2019, 2021 Vanessa McHale
@@ -29,7 +29,7 @@
     build-depends:
         base >=4.7 && <5,
         chs-deps,
-        Cabal >=3.12.0.0
+        Cabal >=3.14.0.0
 
     if impl(ghc >=8.0)
         ghc-options:
diff --git a/src/Distribution/C2Hs.hs b/src/Distribution/C2Hs.hs
--- a/src/Distribution/C2Hs.hs
+++ b/src/Distribution/C2Hs.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE DataKinds #-}
+
 -- | Everything in this module is slightly morally dubious in that it works by
 -- considering *all* modules to be @exposed-modules@ in the preprocessor phase.
 --
@@ -20,9 +22,10 @@
                                                         defaultMainWithHooks,
                                                         simpleUserHooks)
 import           Distribution.Simple.LocalBuildInfo    (LocalBuildInfo)
-import           Distribution.Simple.Setup             (BuildFlags (BuildFlags, buildVerbosity),
-                                                        HaddockFlags (HaddockFlags, haddockVerbosity),
-                                                        ReplFlags (ReplFlags, replVerbosity),
+import           Distribution.Simple.Setup             (BuildFlags, buildCommonFlags,
+                                                        HaddockFlags, haddockCommonFlags,
+                                                        ReplFlags, replCommonFlags,
+                                                        CommonSetupFlags (CommonSetupFlags, setupVerbosity),
                                                         fromFlagOrDefault)
 import           Distribution.Types.Benchmark
 import           Distribution.Types.BuildInfo
@@ -31,12 +34,11 @@
 import           Distribution.Types.Library
 import           Distribution.Types.PackageDescription
 import           Distribution.Types.TestSuite
-import           Distribution.Utils.Path               (PackageDir, SourceDir,
-                                                        SymbolicPath,
-                                                        getSymbolicPath)
+import           Distribution.Utils.Path               (Pkg, Source, FileOrDir (Dir),
+                                                        SymbolicPath)
 import           Distribution.Verbosity                (Verbosity, normal)
 
-type CabalFP = SymbolicPath PackageDir SourceDir
+type CabalFP = SymbolicPath Pkg (Dir Source)
 
 defaultMainC2Hs :: IO ()
 defaultMainC2Hs = defaultMainWithHooks c2hsUserHooks
@@ -48,37 +50,28 @@
                                 , replHook = c2hsReplHooks
                                 }
 
-reorderC2Hs' :: Verbosity -> [CabalFP] -> [ModuleName] -> IO [ModuleName]
-reorderC2Hs' v fps = reorderC2Hs v (fmap getSymbolicPath fps)
-
 -- | Custom build hooks to be used with @.chs@ files which @{\#import\#}@ one
 -- another.
 c2hsBuildHooks :: PackageDescription -> LocalBuildInfo -> UserHooks -> BuildFlags -> IO ()
 c2hsBuildHooks = \pd lbi hooks bf -> do
-    let v = getVerbosity bf
-    pd' <- mapPackageDescription (reorderC2Hs' v) pd
+    let v = getSetupVerbosity (buildCommonFlags bf)
+    pd' <- mapPackageDescription (reorderC2Hs v) pd
     buildHook simpleUserHooks pd' lbi hooks bf
 
 c2hsHaddockHooks :: PackageDescription -> LocalBuildInfo -> UserHooks -> HaddockFlags -> IO ()
 c2hsHaddockHooks = \pd lbi hooks hf -> do
-    let v = getHaddockVerbosity hf
-    pd' <- mapPackageDescription (reorderC2Hs' v) pd
+    let v = getSetupVerbosity (haddockCommonFlags hf)
+    pd' <- mapPackageDescription (reorderC2Hs v) pd
     haddockHook simpleUserHooks pd' lbi hooks hf
 
 c2hsReplHooks :: PackageDescription -> LocalBuildInfo -> UserHooks -> ReplFlags -> [String] -> IO ()
 c2hsReplHooks = \pd lbi hooks rf ss -> do
-    let v = getReplVerbosity rf
-    pd' <- mapPackageDescription (reorderC2Hs' v) pd
+    let v = getSetupVerbosity (replCommonFlags rf)
+    pd' <- mapPackageDescription (reorderC2Hs v) pd
     replHook simpleUserHooks pd' lbi hooks rf ss
 
-getHaddockVerbosity :: HaddockFlags -> Verbosity
-getHaddockVerbosity HaddockFlags { haddockVerbosity = v } = fromFlagOrDefault normal v
-
-getVerbosity :: BuildFlags -> Verbosity
-getVerbosity BuildFlags { buildVerbosity = v } = fromFlagOrDefault normal v
-
-getReplVerbosity :: ReplFlags -> Verbosity
-getReplVerbosity ReplFlags { replVerbosity = v } = fromFlagOrDefault normal v
+getSetupVerbosity :: CommonSetupFlags -> Verbosity
+getSetupVerbosity CommonSetupFlags { setupVerbosity = v } = fromFlagOrDefault normal v
 
 mapPackageDescription :: ([CabalFP] -> [ModuleName] -> IO [ModuleName]) -> PackageDescription -> IO PackageDescription
 mapPackageDescription f p@PackageDescription { library = ml
diff --git a/src/Distribution/C2Hs/TopSort.hs b/src/Distribution/C2Hs/TopSort.hs
--- a/src/Distribution/C2Hs/TopSort.hs
+++ b/src/Distribution/C2Hs/TopSort.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE DataKinds #-}
+
 -- | Topological sort for @.chs@ files according to @{\#import\#}@s.
 module Distribution.C2Hs.TopSort ( reorderC2Hs ) where
 
@@ -7,35 +9,39 @@
 import           Distribution.Compat.Graph            (Node (..),
                                                        fromDistinctList,
                                                        revTopSort)
-import           Distribution.ModuleName              (ModuleName, toFilePath)
+import           Distribution.ModuleName              (ModuleName)
 import           Distribution.Parsec                  (simpleParsec)
 import           Distribution.Simple.PreProcess.Types (Suffix (..))
-import           Distribution.Simple.Utils            (findFileWithExtension,
+import           Distribution.Utils.Path               (FileOrDir (..), Pkg, Source, (</>),
+                                                        SymbolicPath,
+                                                        interpretSymbolicPathCWD)
+import           Distribution.Simple.Utils            (findModuleFileEx,
                                                        warn)
 import           Distribution.Verbosity               (Verbosity)
 import           Language.Haskell.CHs.Deps            (getFileImports)
 
+type CabalDir = SymbolicPath Pkg (Dir Source)
+
 -- | Given a list of 'ModuleName's, sort it according to @c2hs@ @{\#import\#}@
 -- declarations.
 reorderC2Hs :: Verbosity
-            -> [FilePath] -- ^ Source directories
+            -> [CabalDir] -- ^ Source directories
             -> [ModuleName] -- ^ Module names
             -> IO [ModuleName] -- ^ Sorted modules
 reorderC2Hs v dirs preMods = do
 
-    chsFiles <- traverse findCHS preMods
+    chsFiles <- traverse (fmap (interpretSymbolicPathCWD . uncurry (</>)) . findCHS) preMods
 
     modDeps <- traverse (extractDeps v) (zip preMods chsFiles)
 
     pure $ fmap (\(N m _ _) -> m) (revTopSort $ fromDistinctList modDeps)
 
-        where findCHS = findFileWithExtension [Suffix ".chs"] dirs . toFilePath
+        where findCHS = findModuleFileEx v dirs [Suffix ".chs"]
 
 -- | Given a 'ModuleName' and its corresponding filepath, return a 'Node'
 -- with its associated @c2hs@ dependencies
-extractDeps :: Verbosity -> (ModuleName, Maybe FilePath) -> IO (Node ModuleName ModuleName)
-extractDeps _ (m, Nothing) = pure (N m m [])
-extractDeps v (m, Just f) = do
+extractDeps :: Verbosity -> (ModuleName, FilePath) -> IO (Node ModuleName ModuleName)
+extractDeps v (m, f) = do
     res <- getFileImports f
     mods <- case res of
         Right ms -> case traverse simpleParsec ms of
