diff --git a/Tests.hs b/Tests.hs
--- a/Tests.hs
+++ b/Tests.hs
@@ -11,7 +11,6 @@
 import Data.Map as Map (differenceWithKey, insert, intersectionWithKey)
 import qualified Data.Map as Map (elems, Map, toList)
 import Data.Maybe (fromMaybe)
-import Data.Monoid ((<>))
 import Data.Set as Set (fromList, union, insert)
 import Data.Text as Text (intercalate, split, Text, unlines, unpack)
 import Data.Version (Version(Version))
diff --git a/cabal-debian.cabal b/cabal-debian.cabal
--- a/cabal-debian.cabal
+++ b/cabal-debian.cabal
@@ -1,7 +1,8 @@
+cabal-version:  3.0
 Name:           cabal-debian
-Version:        5.1.1
+Version:        5.2
 Copyright:      Copyright (c) 2007-2014, David Fox, Jeremy Shaw; 2017-2022 Clint Adams
-License:        BSD3
+License:        BSD-3-Clause
 License-File:   LICENSE
 Author:         David Fox <dsf@seereason.com>
 Category:       Debian, Distribution, System
@@ -16,7 +17,6 @@
  For documentation of the executable, run
  @cabal-debian --help@, for documentation of the library API follow
  the link to the @Debian.Debianize@ module below.
-Cabal-Version: >= 1.10
 Extra-Source-Files:
   changelog
   debian/cabal-debian.1
@@ -144,7 +144,7 @@
   test-data/artvaluereport2/output/debian/artvaluereport2-backups.install
   test-data/artvaluereport2/output/debian/copyright
   test-data/artvaluereport2/output/debian/source/format
-Tested-With: GHC ==9.2.3 || ==9.0.2 || ==8.10.7 || ==8.8.4 || ==8.6.5 || ==8.4.4
+Tested-With: GHC ==9.2.3 || ==9.0.2 || ==8.10.7 || ==8.8.4
 
 Source-Repository head
   type: git
@@ -155,9 +155,9 @@
   Hs-Source-Dirs: src
   GHC-Options: -Wall
   Build-Depends:
-    base >= 4.8 && < 5,
+    base >= 4.11.1 && < 5,
     bifunctors,
-    Cabal >= 2.2,
+    Cabal >= 3.0,
     containers,
     data-default,
     deepseq,
@@ -214,6 +214,8 @@
     Debian.Debianize.VersionSplits
     Paths_cabal_debian
     System.Git
+  autogen-modules:
+    Paths_cabal_debian
   Other-Modules:
     Debian.Orphans
 
@@ -223,9 +225,9 @@
   Main-is: CabalDebian.hs
   ghc-options: -threaded -Wall
   Build-Depends:
-    base >= 4.8 && <5,
+    base >= 4.11.1 && <5,
     cabal-debian,
-    Cabal >= 2.2,
+    Cabal >= 3.0,
     debian >= 3.95,
     lens,
     mtl,
@@ -239,9 +241,9 @@
   Main-is: Tests.hs
   ghc-options: -threaded -Wall
   Build-Depends:
-    base >= 4.8 && < 5,
+    base >= 4.11.1 && < 5,
     cabal-debian,
-    Cabal >= 2.2,
+    Cabal >= 3.0,
     containers,
     debian >= 3.95,
     Diff >= 0.3.1,
diff --git a/src/Debian/Debianize/BinaryDebDescription.hs b/src/Debian/Debianize/BinaryDebDescription.hs
--- a/src/Debian/Debianize/BinaryDebDescription.hs
+++ b/src/Debian/Debianize/BinaryDebDescription.hs
@@ -33,7 +33,6 @@
 import Data.Generics (Data, Typeable)
 import Control.Lens.TH (makeLenses)
 import Data.List (sort, sortBy)
-import Data.Monoid (Monoid(..))
 import Data.Text (Text)
 import Debian.Policy (PackageArchitectures, PackagePriority, Section, MultiArch)
 import Debian.Relation (BinPkgName, Relations)
diff --git a/src/Debian/Debianize/BuildDependencies.hs b/src/Debian/Debianize/BuildDependencies.hs
--- a/src/Debian/Debianize/BuildDependencies.hs
+++ b/src/Debian/Debianize/BuildDependencies.hs
@@ -16,7 +16,6 @@
 import Data.List as List (filter, groupBy, map, minimumBy, nub, sortBy)
 import Data.Map as Map (lookup, Map)
 import Data.Maybe (catMaybes, fromMaybe, isJust, isNothing, listToMaybe, mapMaybe, maybeToList)
-import Data.Monoid ((<>))
 import Data.Set as Set (empty, fold, fromList, map, member, Set, singleton, toList, union)
 import Debian.Debianize.Prelude
 import Debian.Debianize.BasicInfo (compilerFlavor)
@@ -78,11 +77,7 @@
 unboxDependency (BuildDepends d) = Just d
 unboxDependency (BuildTools d) = Just d
 unboxDependency (PkgConfigDepends d) = Just d
-#if MIN_VERSION_Cabal(3,0,0)
 unboxDependency (ExtraLibs _) = Nothing -- Dependency (PackageName d) anyVersion mempty
-#else
-unboxDependency (ExtraLibs _) = Nothing -- Dependency (PackageName d) anyVersion
-#endif
 
 -- |Debian packages don't have per binary package build dependencies,
 -- so we just gather them all up here.
@@ -119,17 +114,11 @@
 mergeCabalDependencies =
 #if MIN_VERSION_Cabal(3,4,0)
     List.map (foldl1 (\ (Dependency name range1 _) (Dependency _ range2 _) -> Dependency name (intersectVersionRanges range1 range2) (NES.singleton defaultLibName))) . groupBy ((==) `on` dependencyPackage) . sortBy (compare `on` dependencyPackage)
-#elif MIN_VERSION_Cabal(3,0,0)
-    List.map (foldl1 (\ (Dependency name range1 _) (Dependency _ range2 _) -> Dependency name (intersectVersionRanges range1 range2) mempty)) . groupBy ((==) `on` dependencyPackage) . sortBy (compare `on` dependencyPackage)
 #else
-    List.map (foldl1 (\ (Dependency name range1) (Dependency _ range2) -> Dependency name (intersectVersionRanges range1 range2))) . groupBy ((==) `on` dependencyPackage) . sortBy (compare `on` dependencyPackage)
+    List.map (foldl1 (\ (Dependency name range1 _) (Dependency _ range2 _) -> Dependency name (intersectVersionRanges range1 range2) mempty)) . groupBy ((==) `on` dependencyPackage) . sortBy (compare `on` dependencyPackage)
 #endif
     where
-#if MIN_VERSION_Cabal(3,0,0)
       dependencyPackage (Dependency x _ _) = x
-#else
-      dependencyPackage (Dependency x _) = x
-#endif
 
 -- The haskell-devscripts-minimal package contains the hlibrary.mk file with
 -- the rules for building haskell packages.
@@ -220,11 +209,7 @@
 -- documentation package for any libraries which are build
 -- dependencies, so we have use to all the cross references.
 docDependencies :: (MonadIO m) => Dependency_ -> CabalT m D.Relations
-#if MIN_VERSION_Cabal(3,0,0)
 docDependencies (BuildDepends (Dependency name ranges _)) =
-#else
-docDependencies (BuildDepends (Dependency name ranges)) =
-#endif
     do hc <- use (A.debInfo . D.flags . compilerFlavor)
        let hcs = singleton hc -- vestigial
        omitProfDeps <- use (A.debInfo . D.omitProfVersionDeps)
@@ -235,46 +220,27 @@
 -- libraries and the documentation packages, used for creating cross
 -- references.  Also the packages associated with extra libraries.
 buildDependencies :: (MonadIO m) => Set (CompilerFlavor, B.PackageType) -> Dependency_ -> CabalT m D.Relations
-#if MIN_VERSION_Cabal(3,0,0)
 buildDependencies hcTypePairs (BuildDepends (Dependency name ranges _)) =
     use (A.debInfo . D.omitProfVersionDeps) >>= \ omitProfDeps ->
     concat <$> mapM (\ (hc, typ) -> dependencies hc typ name ranges omitProfDeps) (toList hcTypePairs)
-#else
-buildDependencies hcTypePairs (BuildDepends (Dependency name ranges)) =
-    use (A.debInfo . D.omitProfVersionDeps) >>= \ omitProfDeps ->
-    concat <$> mapM (\ (hc, typ) -> dependencies hc typ name ranges omitProfDeps) (toList hcTypePairs)
-#endif
 buildDependencies _ dep@(ExtraLibs _) =
     do mp <- use (A.debInfo . D.execMap)
        return $ concat $ adapt mp dep
 buildDependencies _ dep =
     case unboxDependency dep of
-#if MIN_VERSION_Cabal(3,0,0)
       Just (Dependency _name _ranges _) ->
-#else
-      Just (Dependency _name _ranges) ->
-#endif
           do mp <- view (A.debInfo . D.execMap) <$> get
              return $ concat $ adapt mp dep
       Nothing ->
           return []
 
 adapt :: Map.Map String Relations -> Dependency_ -> [Relations]
-#if MIN_VERSION_Cabal(3,0,0)
 adapt mp (PkgConfigDepends (Dependency pkg _ _)) =
     maybe (aptFile (unPackageName pkg)) (: []) (Map.lookup (unPackageName pkg) mp)
 adapt mp (BuildTools (Dependency pkg _ _)) =
     maybe (aptFile (unPackageName pkg)) (: []) (Map.lookup (unPackageName pkg) mp)
 adapt _flags (ExtraLibs x) = [x]
 adapt _flags (BuildDepends (Dependency pkg _ _)) = [[[D.Rel (D.BinPkgName (unPackageName pkg)) Nothing Nothing]]]
-#else
-adapt mp (PkgConfigDepends (Dependency pkg _)) =
-    maybe (aptFile (unPackageName pkg)) (: []) (Map.lookup (unPackageName pkg) mp)
-adapt mp (BuildTools (Dependency pkg _)) =
-    maybe (aptFile (unPackageName pkg)) (: []) (Map.lookup (unPackageName pkg) mp)
-adapt _flags (ExtraLibs x) = [x]
-adapt _flags (BuildDepends (Dependency pkg _)) = [[[D.Rel (D.BinPkgName (unPackageName pkg)) Nothing Nothing]]]
-#endif
 
 -- There are three reasons this may not work, or may work
 -- incorrectly: (1) the build environment may be a different
@@ -336,7 +302,9 @@
             rangeToRange (ThisVersionF v)                = (debianVersion' name >=> \ dv -> return $ Rel' (D.Rel dname (Just (D.EEQ dv)) Nothing)) v
             rangeToRange (LaterVersionF v)               = (debianVersion' name >=> \ dv -> return $ Rel' (D.Rel dname (Just (D.SGR dv)) Nothing)) v
             rangeToRange (EarlierVersionF v)             = (debianVersion' name >=> \ dv -> return $ Rel' (D.Rel dname (Just (D.SLT dv)) Nothing)) v
-            rangeToRange (OrLaterVersionF v)             = (debianVersion' name >=> \ dv -> return $ Rel' (D.Rel dname (Just (D.GRE dv)) Nothing)) v
+            rangeToRange (OrLaterVersionF v)
+               | v == mkVersion [0] = return $ Rel' (D.Rel dname Nothing Nothing)
+               | otherwise = (debianVersion' name >=> \ dv -> return $ Rel' (D.Rel dname (Just (D.GRE dv)) Nothing)) v
             rangeToRange (OrEarlierVersionF v)           = (debianVersion' name >=> \ dv -> return $ Rel' (D.Rel dname (Just (D.LTE dv)) Nothing)) v
 #if !MIN_VERSION_Cabal(3,4,0)
             rangeToRange (WildcardVersionF v)            = (\ x y -> debianVersion' name x >>= \ dvx ->
diff --git a/src/Debian/Debianize/CopyrightDescription.hs b/src/Debian/Debianize/CopyrightDescription.hs
--- a/src/Debian/Debianize/CopyrightDescription.hs
+++ b/src/Debian/Debianize/CopyrightDescription.hs
@@ -42,7 +42,6 @@
 import Control.Lens.TH (makeLenses)
 import Data.List as List (dropWhileEnd, partition)
 import Data.Maybe.Extended (isJust, catMaybes, fromJust, fromMaybe, listToMaybe, nothingIf)
-import Data.Monoid ((<>), mempty)
 import Data.Text as Text (Text, pack, strip, unpack, null, lines, unlines, dropWhileEnd)
 import Debian.Control (Field'(Field), fieldValue, Paragraph'(Paragraph), Control'(Control, unControl), parseControl)
 import Debian.Debianize.Prelude (readFileMaybe)
diff --git a/src/Debian/Debianize/Details.hs b/src/Debian/Debianize/Details.hs
--- a/src/Debian/Debianize/Details.hs
+++ b/src/Debian/Debianize/Details.hs
@@ -30,12 +30,6 @@
        -- (eponymous) debian package names
        mapM_ (\name -> (A.debInfo . D.execMap) %= Map.insert name [[Rel (BinPkgName name) Nothing Nothing]])
             ["alex", "c2hs", "ghc", "happy", "hsx2hs"]
-       -- The parsec debs are suffixed with either "2" or "3"
-#if !MIN_VERSION_base(4,11,1)
--- The deb of ghc-8.4.3 changes the libghc-parsec3-dev name to libghc-parsec-deb
-       mapCabal (mkPackageName "parsec") (DebBase "parsec3")
-#endif
-       -- Similar split for quickcheck
        mapCabal (mkPackageName "QuickCheck") (DebBase "quickcheck2")
        -- Something was required for this package at one time - it
        -- looks like a no-op now
diff --git a/src/Debian/Debianize/Files.hs b/src/Debian/Debianize/Files.hs
--- a/src/Debian/Debianize/Files.hs
+++ b/src/Debian/Debianize/Files.hs
@@ -8,14 +8,12 @@
 
 
 import Control.Lens
-import Control.Monad.Fail (MonadFail)
 import Control.Monad.Trans (lift)
 import Control.Monad.Writer (execWriterT, tell, WriterT)
 import Data.Char (isSpace)
 import Data.List as List (dropWhile, dropWhileEnd, map)
 import Data.Map as Map (fromListWithKey, insertWith, map, Map, mapKeys, toList)
 import Data.Maybe (fromMaybe)
-import Data.Monoid ((<>))
 import Data.Set as Set (fold, member, toList)
 import Data.Text as Text (dropWhile, dropWhileEnd, intercalate, lines, null, pack, strip, Text, unlines, unpack)
 import Debian.Control (Control'(Control, unControl), Field'(Field), Paragraph'(Paragraph))
diff --git a/src/Debian/Debianize/Finalize.hs b/src/Debian/Debianize/Finalize.hs
--- a/src/Debian/Debianize/Finalize.hs
+++ b/src/Debian/Debianize/Finalize.hs
@@ -12,7 +12,6 @@
 import Control.Lens hiding ((<.>))
 import Control.Monad (unless, when)
 import Control.Monad as List (mapM_)
-import Control.Monad.Fail (MonadFail)
 import Control.Monad.State (get, modify)
 import Control.Monad.Trans (liftIO, MonadIO)
 import Data.ByteString.Lazy.UTF8 (fromString)
@@ -22,7 +21,6 @@
 import Data.List as List (dropWhileEnd, filter, intercalate, map, nub, null, unlines, maximumBy)
 import Data.Map as Map (delete, elems, insertWith, lookup, Map, toList)
 import Data.Maybe (fromMaybe, isJust, fromJust)
-import Data.Monoid ((<>))
 import Data.Set as Set (difference, filter, fold, fromList, insert, map, null, Set, singleton, toList, union, unions)
 import Data.Text as Text (intercalate, pack, Text, unlines, unpack)
 import Debian.Changes (ChangeLog(..), ChangeLogEntry(..))
diff --git a/src/Debian/Debianize/Goodies.hs b/src/Debian/Debianize/Goodies.hs
--- a/src/Debian/Debianize/Goodies.hs
+++ b/src/Debian/Debianize/Goodies.hs
@@ -21,7 +21,6 @@
 import Control.Monad.State (MonadState(get), modify)
 import Data.List as List ({-dropWhileEnd, intercalate,-} intersperse, map)
 import Data.Map as Map (insert, insertWith, toList)
-import Data.Monoid ((<>))
 import Data.Set as Set (insert, singleton, union)
 import Data.Text as Text (pack, {-Text,-} unlines)
 import qualified Debian.Debianize.DebInfo as D
diff --git a/src/Debian/Debianize/InputDebian.hs b/src/Debian/Debianize/InputDebian.hs
--- a/src/Debian/Debianize/InputDebian.hs
+++ b/src/Debian/Debianize/InputDebian.hs
@@ -18,7 +18,6 @@
 import Data.Char (isSpace)
 import Data.Map as Map (insert, insertWith)
 import Data.Maybe (fromMaybe)
-import Data.Monoid ((<>))
 import Data.Set as Set (fromList, insert, singleton)
 import Data.Text (break, lines, null, pack, strip, Text, unpack, words)
 import Data.Text.IO (readFile)
diff --git a/src/Debian/Debianize/Optparse.hs b/src/Debian/Debianize/Optparse.hs
--- a/src/Debian/Debianize/Optparse.hs
+++ b/src/Debian/Debianize/Optparse.hs
@@ -25,7 +25,6 @@
 import Data.Foldable (forM_)
 import Data.Maybe.Extended (fromMaybe)
 import Data.Maybe.Extended (nothingIf)
-import Data.Monoid ((<>))
 import Debian.Debianize.BasicInfo (EnvSet(EnvSet), cleanOS, dependOS, buildOS, Flags(..))
 import Debian.Debianize.DebInfo (TestsStatus(..))
 import Debian.Debianize.Monad
diff --git a/src/Debian/Debianize/Prelude.hs b/src/Debian/Debianize/Prelude.hs
--- a/src/Debian/Debianize/Prelude.hs
+++ b/src/Debian/Debianize/Prelude.hs
@@ -43,7 +43,6 @@
     ) where
 
 
-import Control.Applicative ((<$>))
 import Control.Exception as E (bracket, catch, throw, try)
 import Control.Lens
 import Control.Monad (when)
@@ -54,7 +53,6 @@
 import Data.Map (Map)
 import qualified Data.Map as Map
 import Data.Maybe (fromJust, fromMaybe, listToMaybe, mapMaybe)
-import Data.Monoid ((<>), mconcat)
 import Data.Set as Set (Set, toList)
 import qualified Data.Set as Set (findMin, fromList, null, size)
 import Data.Text as Text (Text, unpack)
diff --git a/src/Debian/Orphans.hs b/src/Debian/Orphans.hs
--- a/src/Debian/Orphans.hs
+++ b/src/Debian/Orphans.hs
@@ -6,7 +6,6 @@
 import Data.Generics (Data, Typeable)
 import Data.List (intersperse, isPrefixOf)
 import Data.Maybe (fromMaybe)
-import Data.Monoid ((<>))
 import Debian.Changes (ChangeLog(..), ChangeLogEntry(..))
 import Debian.Pretty (PP(PP, unPP))
 import Debian.Relation (ArchitectureReq(..), Relation(..), VersionReq(..))
diff --git a/src/Debian/Policy.hs b/src/Debian/Policy.hs
--- a/src/Debian/Policy.hs
+++ b/src/Debian/Policy.hs
@@ -50,7 +50,6 @@
 import Data.Generics (Data, Typeable)
 import Data.List (groupBy, intercalate)
 import Data.Maybe (fromMaybe, mapMaybe)
-import Data.Monoid ((<>))
 import Data.Text (pack, strip, Text, unpack)
 import Debian.Debianize.Prelude (read')
 import Debian.Pretty (PP(..))
