diff --git a/CHANGES.markdown b/CHANGES.markdown
--- a/CHANGES.markdown
+++ b/CHANGES.markdown
@@ -1,8 +1,16 @@
+1.4.5.1 (10 July 2023)
+----------------------
+
+- Allow `base-4.18`, `mtl-2.3`, and test with GHC 9.6
+
 1.4.5 (12 Nov 2022)
 -------------------
 
 - `TwoD.Layout.Grid`: Return `mempty` in `gridCat` and `gridSnake` on
   empty input ([#89](https://github.com/diagrams/diagrams-contrib/pull/89))
+
+- Hackage revisions
+    - r1 (3 Dec 2022): allow `linear-1.22`
 
 1.4.4 (12 Nov 2019)
 -------------------
diff --git a/diagrams-contrib.cabal b/diagrams-contrib.cabal
--- a/diagrams-contrib.cabal
+++ b/diagrams-contrib.cabal
@@ -1,5 +1,5 @@
 name:                diagrams-contrib
-version:             1.4.5
+version:             1.4.5.1
 synopsis:            Collection of user contributions to diagrams EDSL
 description:         A collection of user contributions for diagrams,
                      an embedded domain-specific language for generation
@@ -13,9 +13,9 @@
 category:            Graphics
 build-type:          Simple
 cabal-version:       1.18
-extra-source-files:  README.markdown, CHANGES.markdown, diagrams/*.svg, CONTRIBUTORS
-extra-doc-files:     diagrams/*.svg
-tested-with:         GHC ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.4 || ==9.4.1
+extra-source-files:  README.markdown, diagrams/*.svg, CONTRIBUTORS
+extra-doc-files:     diagrams/*.svg, CHANGES.markdown
+tested-with:         GHC ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.7 || ==9.4.5 || ==9.6.1
 Source-repository head
   type:     git
   location: http://github.com/diagrams/diagrams-contrib.git
@@ -51,8 +51,8 @@
                        Diagrams.TwoD.Path.Metafont.Internal
                        Diagrams.TwoD.Path.Metafont.Combinators
                        Diagrams.TwoD.Path.Metafont.Parser
-  build-depends:       base >= 4.8 && < 4.18,
-                       mtl >= 2.0 && < 2.3,
+  build-depends:       base >= 4.8 && < 4.19,
+                       mtl >= 2.0 && < 2.4,
                        mtl-compat >= 0.2.1 && < 0.3,
                        containers > 0.4 && < 0.7,
                        split >= 0.2.1 && < 0.3,
@@ -63,7 +63,7 @@
                        diagrams-lib >= 1.4 && < 1.5,
                        diagrams-solve >= 0.1 && < 0.2,
                        lens >= 4.0 && < 5.3,
-                       linear >= 1.11.3 && < 1.22,
+                       linear >= 1.11.3 && < 1.23,
                        force-layout >= 0.4 && < 0.5,
                        data-default >= 0.5.2 && < 0.8,
                        MonadRandom >= 0.1.8 && < 0.7,
diff --git a/src/Diagrams/Anchors.hs b/src/Diagrams/Anchors.hs
--- a/src/Diagrams/Anchors.hs
+++ b/src/Diagrams/Anchors.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP                       #-}
 {-# LANGUAGE DefaultSignatures         #-}
 {-# LANGUAGE TemplateHaskell           #-}
 {-# LANGUAGE TypeFamilies              #-}
@@ -59,9 +58,6 @@
 import           Data.Maybe       (fromJust, fromMaybe)
 import qualified Data.Set         as Set
 import           Data.Typeable    (Typeable)
-#if !MIN_VERSION_base(4,11,0)
-import           Data.Semigroup
-#endif
 
 import           Linear.Vector
 import           Linear.V2
diff --git a/src/Diagrams/Layout/Wrap.hs b/src/Diagrams/Layout/Wrap.hs
--- a/src/Diagrams/Layout/Wrap.hs
+++ b/src/Diagrams/Layout/Wrap.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE FlexibleContexts    #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TypeFamilies        #-}
+{-# LANGUAGE TypeOperators       #-}
 
 ------------------------------------------------------------------------
 -- |
diff --git a/src/Diagrams/Lens.hs b/src/Diagrams/Lens.hs
--- a/src/Diagrams/Lens.hs
+++ b/src/Diagrams/Lens.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP                   #-}
 {-# LANGUAGE ConstraintKinds       #-}
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE FlexibleInstances     #-}
@@ -35,10 +34,6 @@
   , _lineSegments
   ) where
 
-#if __GLASGOW_HASKELL__ < 710
-import           Control.Applicative
-import           Data.Foldable
-#endif
 import           Diagrams.BoundingBox
 import           Diagrams.Prelude
 
diff --git a/src/Diagrams/TwoD/Layout/Constrained.hs b/src/Diagrams/TwoD/Layout/Constrained.hs
--- a/src/Diagrams/TwoD/Layout/Constrained.hs
+++ b/src/Diagrams/TwoD/Layout/Constrained.hs
@@ -140,7 +140,7 @@
 
 import qualified Control.Lens         as L
 import qualified Control.Lens.Extras  as L
-import           Control.Monad.Except
+import           Control.Monad        (zipWithM, zipWithM_)
 import           Control.Monad.State
 import qualified Data.Foldable        as F
 import           Data.Hashable
diff --git a/src/Diagrams/TwoD/Layout/Tree.hs b/src/Diagrams/TwoD/Layout/Tree.hs
--- a/src/Diagrams/TwoD/Layout/Tree.hs
+++ b/src/Diagrams/TwoD/Layout/Tree.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP                       #-}
 {-# LANGUAGE DeriveFoldable            #-}
 {-# LANGUAGE DeriveFunctor             #-}
 {-# LANGUAGE DeriveTraversable         #-}
@@ -170,14 +169,6 @@
 import           Diagrams
 import           Linear              ((*^))
 import           Linear.Affine
-
-#if !MIN_VERSION_base(4,11,0)
-import           Data.Semigroup
-#endif
-
-#if __GLASGOW_HASKELL__ < 710
-import           Control.Applicative
-#endif
 
 ------------------------------------------------------------
 --  Binary trees
diff --git a/src/Diagrams/TwoD/Path/IteratedSubset.hs b/src/Diagrams/TwoD/Path/IteratedSubset.hs
--- a/src/Diagrams/TwoD/Path/IteratedSubset.hs
+++ b/src/Diagrams/TwoD/Path/IteratedSubset.hs
@@ -1,8 +1,8 @@
-{-# LANGUAGE CPP                   #-}
 {-# LANGUAGE ExplicitForAll        #-}
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeFamilies          #-}
+{-# LANGUAGE TypeOperators         #-}
 
 -----------------------------------------------------------------------------
 -- |
@@ -534,10 +534,6 @@
 --   code and modify it to suit.
 randITC ::
   (MonadRandom m,
-#if MIN_VERSION_base(4,9,0)
-#else
-   Applicative m,
-#endif
    Ord n, Floating n, Random n) =>
            m (IterTrailConfig n)
 randITC = do
diff --git a/src/Diagrams/TwoD/Path/Metafont.hs b/src/Diagrams/TwoD/Path/Metafont.hs
--- a/src/Diagrams/TwoD/Path/Metafont.hs
+++ b/src/Diagrams/TwoD/Path/Metafont.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE GADTs           #-}
 {-# LANGUAGE TypeFamilies    #-}
+{-# LANGUAGE TypeOperators   #-}
 
 -----------------------------------------------------------------------------
 -- |
diff --git a/src/Diagrams/TwoD/Path/Metafont/Parser.hs b/src/Diagrams/TwoD/Path/Metafont/Parser.hs
--- a/src/Diagrams/TwoD/Path/Metafont/Parser.hs
+++ b/src/Diagrams/TwoD/Path/Metafont/Parser.hs
@@ -8,7 +8,7 @@
 import           Text.Parsec
 import           Text.Parsec.Text
 
-import           Diagrams.Prelude                  hiding (option)
+import           Diagrams.Prelude hiding (option)
 import           Diagrams.TwoD.Path.Metafont.Types
 
 num :: Read n => Parser n
diff --git a/src/Diagrams/TwoD/Path/Metafont/Types.hs b/src/Diagrams/TwoD/Path/Metafont/Types.hs
--- a/src/Diagrams/TwoD/Path/Metafont/Types.hs
+++ b/src/Diagrams/TwoD/Path/Metafont/Types.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP               #-}
 {-# LANGUAGE DeriveFunctor     #-}
 {-# LANGUAGE EmptyDataDecls    #-}
 {-# LANGUAGE FlexibleInstances #-}
@@ -8,14 +7,7 @@
 module Diagrams.TwoD.Path.Metafont.Types where
 
 import Control.Lens hiding (( # ))
-#if __GLASGOW_HASKELL__ < 710
-import Data.Monoid
-#endif
 
-#if !MIN_VERSION_base(4,11,0)
-import           Data.Semigroup
-#endif
-
 import Diagrams.Direction
 import Diagrams.TwoD.Types
 
@@ -111,11 +103,10 @@
 instance Monoid (PathJoin (Maybe (PathDir n)) (Maybe (BasicJoin n))) where
     -- | The default join, with no directions specified, and both tensions 1.
     mempty = PJ Nothing Nothing Nothing
-    l `mappend` r = PJ (c (l^.d1) (r^.d1)) (c (l^.j) (r^.j)) (c (l^.d2) (r^.d2))
+
+instance Semigroup (PathJoin (Maybe (PathDir n)) (Maybe (BasicJoin n))) where
+    l <> r = PJ (c (l^.d1) (r^.d1)) (c (l^.j) (r^.j)) (c (l^.d2) (r^.d2))
       where
         c a b = case b of
             Nothing -> a
             Just _  -> b
-
-instance Semigroup (PathJoin (Maybe (PathDir n)) (Maybe (BasicJoin n))) where
-    (<>) = mappend
diff --git a/src/Diagrams/TwoD/Path/Turtle/Internal.hs b/src/Diagrams/TwoD/Path/Turtle/Internal.hs
--- a/src/Diagrams/TwoD/Path/Turtle/Internal.hs
+++ b/src/Diagrams/TwoD/Path/Turtle/Internal.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE FlexibleInstances     #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeFamilies          #-}
+{-# LANGUAGE TypeOperators         #-}
 {-# LANGUAGE TypeSynonymInstances  #-}
 -----------------------------------------------------------------------------
 -- |
diff --git a/src/Diagrams/TwoD/Tilings.hs b/src/Diagrams/TwoD/Tilings.hs
--- a/src/Diagrams/TwoD/Tilings.hs
+++ b/src/Diagrams/TwoD/Tilings.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP                   #-}
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE ScopedTypeVariables   #-}
@@ -69,12 +68,9 @@
 
   ) where
 
+import           Control.Monad        (when, zipWithM_)
 import           Control.Monad.State
-#if __GLASGOW_HASKELL__ >= 704
-import           Control.Monad.Writer hiding ((<>))
-#else
 import           Control.Monad.Writer
-#endif
 
 import           Data.Function        (on)
 import           Data.List            (mapAccumL, sort)
