diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+* 0.2.3.4: 18 April 2026
+
+- Allow `base-4.22` and test on GHC 9.14
+- Remove `semigroups` dependency
+
 * 0.2.3.3: 31 March 2026
 
 - Fix [#17](https://github.com/diagrams/dual-tree/issues/17): Restore
diff --git a/dual-tree.cabal b/dual-tree.cabal
--- a/dual-tree.cabal
+++ b/dual-tree.cabal
@@ -1,5 +1,5 @@
 name:                dual-tree
-version:             0.2.3.3
+version:             0.2.3.4
 synopsis:            Rose trees with cached and accumulating monoidal annotations
 description:         Rose (n-ary) trees with both upwards- (/i.e./
                      cached) and downwards-traveling (/i.e./
@@ -31,7 +31,7 @@
 build-type:          Simple
 cabal-version:       >=1.10
 bug-reports:         https://github.com/diagrams/dual-tree/issues
-tested-with:         GHC ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.8 || ==9.4.8 || ==9.6.5 || ==9.8.2 || ==9.10.1 || ==9.12.1
+tested-with:         GHC ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.8 || ==9.4.8 || ==9.6.5 || ==9.8.2 || ==9.10.1 || ==9.12.1 || ==9.14.1
 source-repository head
   type: git
   location: https://github.com/diagrams/dual-tree.git
@@ -40,8 +40,7 @@
   default-language:  Haskell2010
   exposed-modules:   Data.Tree.DUAL
                      Data.Tree.DUAL.Internal
-  build-depends:     base >= 4.3 && < 4.22,
-                     semigroups >= 0.8 && < 0.21,
+  build-depends:     base >= 4.3 && < 4.23,
                      monoid-extras >= 0.6 && < 0.8
   hs-source-dirs:    src
   other-extensions:  GeneralizedNewtypeDeriving,
@@ -60,5 +59,4 @@
                      QuickCheck,
                      testing-feat,
                      monoid-extras,
-                     semigroups,
                      dual-tree
