diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -2,6 +2,15 @@
 
 `simple-cabal` uses [PVP Versioning](https://pvp.haskell.org)
 
+## 0.2.0 (2025-09-17)
+- support Cabal 3.14:
+- readGenericPackageDescription' replaces readGenericPackageDescription
+  (which changed type for Cabal >= 3.14)
+- tryFindPackageDesc' replaces tryFindPackageDesc to allow for Cabal >= 3.14
+- add simpleParsec (Cabal >= 2.2)
+- export UnqualComponentName, mkUnqualComponentName (Cabal >= 2.0)
+- export unUnqualComponentName
+
 ## 0.1.3 (2020-10-04)
 - add allLibraries (from Cabal>= 2.0) and Library
 - deprecate allBuildInfo
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -5,8 +5,10 @@
 [![Stackage Lts](http://stackage.org/package/simple-cabal/badge/lts)](http://stackage.org/lts/package/simple-cabal)
 [![Stackage Nightly](http://stackage.org/package/simple-cabal/badge/nightly)](http://stackage.org/nightly/package/simple-cabal)
 
-A small compatibility wrapper over Cabal.
+A small compatibility wrapper library over Cabal.
 
+## Examples
+
 ```
 pkgid <- getPackageId
 putStrLn $ showPkgId pkgid
@@ -14,5 +16,11 @@
 
 ```
 cabalfile <- findCabalFile
-genPkgDesc <- readGenericPackageDescription normal cabalfile
+genPkgDesc <- readGenericPackageDescription' normal cabalfile
 ```
+
+## Contribute
+
+simple-cabal is distributed under a BSD3 license.
+
+Contributions are welcome at <https://github.com/juhp/simple-cabal>
diff --git a/SimpleCabal.hs b/SimpleCabal.hs
--- a/SimpleCabal.hs
+++ b/SimpleCabal.hs
@@ -10,7 +10,7 @@
   makeFinalPackageDescription,
   getPackageId,
 --  dependencies,
-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,4,0)
+#if MIN_VERSION_Cabal(2,4,0)
   buildDepends,
 #endif
   buildDependencies,
@@ -22,24 +22,30 @@
   BuildInfo (..),
   Library(..),
   depPkgName, exeDepName, pkgcfgDepName,
+#if MIN_VERSION_Cabal(2,0,0)
+  UnqualComponentName, mkUnqualComponentName,
+#endif
+  unUnqualComponentName,
   FlagName, mkFlagName,
   hasExes, hasLibs,
-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,20,0)
-#else
+#if !MIN_VERSION_Cabal(1,20,0)
   licenseFiles,
 #endif
   PackageDescription (..),
   PackageIdentifier (..),
   PackageName, mkPackageName, unPackageName,
   packageName, packageVersion,
-  readGenericPackageDescription,
+  readGenericPackageDescription',
   showPkgId,
   showVersion,
   simpleParse,
-  tryFindPackageDesc
+#if MIN_VERSION_Cabal(2,2,0)
+  simpleParsec,
+#endif
+  tryFindPackageDesc'
   ) where
 
-#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))
+#if MIN_VERSION_base(4,8,0)
 #else
 import Control.Applicative ((<$>))
 #endif
@@ -55,23 +61,23 @@
 import Distribution.Compiler
 import Distribution.Package  (
                               packageName,
-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,22,0)
-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
+#if MIN_VERSION_Cabal(1,22,0)
+#if MIN_VERSION_Cabal(2,0,0)
                               depPkgName,
                               mkPackageName,
                               unPackageName,
                               unPkgconfigName,
-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,4,0)
+#if MIN_VERSION_Cabal(2,4,0)
                               Dependency,
 #endif
 #else
 #endif
 #endif
-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
+#if MIN_VERSION_Cabal(2,0,0)
 #else
                               Dependency (..),
 #endif
-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)
+#if MIN_VERSION_Cabal(2,0,0)
                               PackageName,
 #else
                               PackageName (..),
@@ -115,22 +121,29 @@
 import Distribution.Types.ComponentRequestedSpec (defaultComponentRequestedSpec)
 import Distribution.Types.LegacyExeDependency (LegacyExeDependency (..))
 import Distribution.Types.PkgconfigDependency (PkgconfigDependency (..))
+import Distribution.Types.UnqualComponentName (UnqualComponentName(),
+                                               mkUnqualComponentName,
+                                               unUnqualComponentName
+                                              )
 #else
 import Distribution.PackageDescription.Configuration (finalizePackageDescription)
 #endif
 #if MIN_VERSION_Cabal(2,2,0)
-import Distribution.PackageDescription.Parsec
-       (
-#if !MIN_VERSION_Cabal(3,8,0)
-         readGenericPackageDescription,
-#endif
-         parseGenericPackageDescriptionMaybe)
+import qualified Distribution.PackageDescription.Parsec as DPP
 #elif MIN_VERSION_Cabal(2,0,0)
-import Distribution.PackageDescription.Parse (readGenericPackageDescription)
+import qualified Distribution.PackageDescription.Parse as DPP
 #else
-import Distribution.PackageDescription.Parse (readPackageDescription)
+import qualified Distribution.PackageDescription.Parse as DPP
 #endif
 
+#if MIN_VERSION_Cabal(3,0,0)
+import Distribution.Parsec (simpleParsec)
+#else
+#if MIN_VERSION_Cabal(2,2,0)
+import Distribution.Parsec.Class (simpleParsec)
+#endif
+#endif
+
 import Distribution.Simple.Compiler (
 #if MIN_VERSION_Cabal(1,22,0)
     compilerInfo
@@ -146,7 +159,7 @@
 #endif
     )
 #if MIN_VERSION_Cabal(3,8,0)
-import Distribution.Simple.PackageDescription (readGenericPackageDescription)
+import qualified Distribution.Simple.PackageDescription as DSP
 #endif
 #if MIN_VERSION_Cabal(2,0,0)
 --import Distribution.Simple.BuildToolDepends (getAllToolDependencies)
@@ -154,6 +167,9 @@
 #else
 import Distribution.Simple.Program   (defaultProgramConfiguration)
 #endif
+#if MIN_VERSION_Cabal(3,14,0)
+import Distribution.Utils.Path (interpretSymbolicPath, makeSymbolicPath)
+#endif
 import qualified Distribution.Simple.Utils as DSU (
 #if MIN_VERSION_Cabal(1,20,0)
     tryFindPackageDesc
@@ -161,15 +177,11 @@
     findPackageDesc
 #endif
     )
-
 import Distribution.System (Platform (..), buildArch, buildOS)
 
 import Distribution.Text (simpleParse)
 
-import Distribution.Verbosity (normal,
-#if !MIN_VERSION_Cabal(2,0,0)
-                               Verbosity
-#endif
+import Distribution.Verbosity (normal, Verbosity
                               )
 
 #if MIN_VERSION_Cabal(2,2,0)
@@ -186,6 +198,7 @@
 import qualified Distribution.Version (Version)
 #endif
 
+import Safe (headMay)
 import System.Directory (getDirectoryContents)
 import System.FilePath (takeExtension)
 
@@ -204,7 +217,7 @@
   where
     filesWithExtension :: FilePath -> String -> IO [FilePath]
     filesWithExtension dir ext =
-      filter (\ f -> takeExtension f == ext && head f /= '.')
+      filter (\ f -> takeExtension f == ext && headMay f /= Just '.')
       <$> getDirectoryContents dir
 
 -- | Get the package name-version from the .cabal file in the current directory.
@@ -212,15 +225,9 @@
 -- @since 0.0.0.1
 getPackageId :: IO PackageIdentifier
 getPackageId = do
-  gpd <- findCabalFile >>= readGenericPackageDescription normal
+  gpd <- findCabalFile >>= readGenericPackageDescription' normal
   return $ package $ packageDescription gpd
 
-#if !MIN_VERSION_Cabal(2,0,0)
-readGenericPackageDescription :: Verbosity
-                              -> FilePath -> IO GenericPackageDescription
-readGenericPackageDescription = readPackageDescription
-#endif
-
 #if MIN_VERSION_Cabal(2,2,0)
 -- | only available with Cabal-2.2+
 --
@@ -228,7 +235,7 @@
 parseFinalPackageDescription :: [(FlagName, Bool)] -> B.ByteString
                           -> IO (Maybe PackageDescription)
 parseFinalPackageDescription flags cabalfile = do
-  let mgenPkgDesc = parseGenericPackageDescriptionMaybe cabalfile
+  let mgenPkgDesc = DPP.parseGenericPackageDescriptionMaybe cabalfile
   case mgenPkgDesc of
     Nothing -> return Nothing
     Just genPkgDesc -> Just <$> makeFinalPackageDescription flags genPkgDesc
@@ -243,6 +250,27 @@
                           -> IO PackageDescription
 finalPackageDescription = readFinalPackageDescription
 
+-- | Legacy version of readGenericPackageDescription
+-- which doesn't use SymbolicPath (or workdir)
+--
+-- since 0.2.0
+readGenericPackageDescription' :: Verbosity -> FilePath -> IO GenericPackageDescription
+readGenericPackageDescription' verb file =
+#if MIN_VERSION_Cabal(3,8,0)
+  DSP.readGenericPackageDescription verb
+#elif MIN_VERSION_Cabal(2,0,0)
+  DPP.readGenericPackageDescription verb
+#else
+  DPP.readPackageDescription verb
+#endif
+--  DPP.readGenericPackageDescription verb
+#if MIN_VERSION_Cabal(3,14,0)
+    Nothing $
+    makeSymbolicPath
+#endif
+    file
+
+
 -- | get PackageDescription from a cabal file
 --
 -- deprecates finalPackageDescription
@@ -251,7 +279,7 @@
 readFinalPackageDescription :: [(FlagName, Bool)] -> FilePath
                             -> IO PackageDescription
 readFinalPackageDescription flags cabalfile =
-  readGenericPackageDescription normal cabalfile >>=
+  readGenericPackageDescription' normal cabalfile >>=
   makeFinalPackageDescription flags
 
 -- | convert a GenericPackageDescription to a final PackageDescription
@@ -337,16 +365,19 @@
 mkFlagName = FlagName
 #endif
 
--- | Find cabal file
-tryFindPackageDesc :: FilePath -> IO FilePath
-tryFindPackageDesc =
-#if MIN_VERSION_Cabal(1,20,0)
-  DSU.tryFindPackageDesc
-#if MIN_VERSION_Cabal(3,0,0)
-    normal
-#endif
+-- | Find cabal file in current directory
+--
+-- since 0.2.0
+tryFindPackageDesc' :: IO FilePath
+tryFindPackageDesc' =
+#if MIN_VERSION_Cabal(3,14,0)
+  interpretSymbolicPath Nothing <$> DSU.tryFindPackageDesc normal Nothing
+#elif MIN_VERSION_Cabal(3,0,0)
+  DSU.tryFindPackageDesc normal "."
+#elif MIN_VERSION_Cabal(1,20,0)
+  DSU.tryFindPackageDesc "."
 #else
-  DSU.findPackageDesc
+  DSU.findPackageDesc "."
 #endif
 
 #if !MIN_VERSION_Cabal(1,20,0)
@@ -382,6 +413,10 @@
 -- | name of dependency
 pkgcfgDepName :: Dependency -> String
 pkgcfgDepName = unPackageName . depPkgName
+
+-- | name of unqualified component
+unUnqualComponentName :: String -> String
+unUnqualComponentName = id
 #endif
 
 #if !MIN_VERSION_Cabal(2,0,0)
diff --git a/simple-cabal.cabal b/simple-cabal.cabal
--- a/simple-cabal.cabal
+++ b/simple-cabal.cabal
@@ -1,7 +1,7 @@
 cabal-version:       >= 1.10
 name:                simple-cabal
-version:             0.1.3.1
-synopsis:            Cabal file wrapper library
+version:             0.2.0
+synopsis:            Cabal compatibility wrapper library
 description:         Find and read .cabal files, and
                      a Cabal dependency compatibility layer.
 homepage:            https://github.com/juhp/simple-cabal
@@ -10,14 +10,15 @@
 license-file:        LICENSE
 author:              Jens Petersen
 maintainer:          juhpetersen@gmail.com
-copyright:           2019-2020,2022 Jens Petersen
+copyright:           2019-2020,2022-2023,2025 Jens Petersen
 category:            Distribution
 build-type:          Simple
 extra-source-files:  README.md
                    , ChangeLog.md
-tested-with:         GHC == 9.0.2, GHC == 9.2.5, GHC == 9.4.3
+tested-with:         GHC == 9.12.2, GHC == 9.10.2, GHC == 9.8.4,
+                     GHC == 9.0.2, GHC == 9.2.8, GHC == 9.4.8, GHC == 9.6.7,
                      GHC == 8.10.7, GHC == 8.8.4, GHC == 8.6.5, GHC == 8.4.4,
-                     GHC == 8.2.2, GHC == 8.0.2, GHC == 7.10.3, GHC == 7.8.4
+                     GHC == 8.2.2, GHC == 8.0.2
 
 source-repository head
   type:                git
@@ -30,7 +31,8 @@
                        bytestring,
                        Cabal,
                        directory,
-                       filepath
+                       filepath,
+                       safe
 
   default-language:    Haskell2010
 
