diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,17 @@
+[1.23.1.2]
+
+  * Bump upper bound for QuickCheck.
+
+  * Remove obsolete semigroups clause for ghc < 8.
+
+  * Allow aeson 2.3 (Francesco Gazzetta).
+
+  * CI: remove ghc 8.10 from testing
+
+  * Use lts-26 in stack.yaml.
+
+  * Set minimum base version 4.15.
+
 [1.23.1.1]
 
   * Remove unused `ghc-prim` dependency (konsumlam).
diff --git a/pandoc-types.cabal b/pandoc-types.cabal
--- a/pandoc-types.cabal
+++ b/pandoc-types.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 Name:                pandoc-types
-version:             1.23.1.1
+version:             1.23.1.2
 Synopsis:            Types for representing a structured document
 Description:         @Text.Pandoc.Definition@ defines the 'Pandoc' data
                      structure, which is used by pandoc to represent
@@ -47,17 +47,15 @@
                      Text.Pandoc.Arbitrary
   Other-modules:     Paths_pandoc_types
   Autogen-modules:   Paths_pandoc_types
-  Build-depends:     base >= 4.5 && < 5,
+  Build-depends:     base >= 4.15 && < 5,
                      containers >= 0.3,
                      text,
                      deepseq >= 1.4.1 && < 1.6,
                      syb >= 0.1 && < 0.8,
                      bytestring >= 0.9 && < 0.13,
-                     aeson >= 0.6.2 && < 2.3,
+                     aeson >= 0.6.2 && < 2.4,
                      transformers >= 0.2 && < 0.7,
-                     QuickCheck >= 2.10 && < 2.18
-  if !impl(ghc >= 8.0)
-    Build-depends:   semigroups == 0.18.*
+                     QuickCheck >= 2.10 && < 2.19
   ghc-options:       -Wall
   default-language:  Haskell2010
 
@@ -69,14 +67,14 @@
   build-depends:       base,
                        pandoc-types,
                        syb,
-                       aeson >= 0.6.2 && < 2.3,
+                       aeson >= 0.6.2 && < 2.4,
                        containers >= 0.3,
                        text,
                        bytestring >= 0.9 && < 0.13,
                        test-framework >= 0.3 && < 0.9,
                        test-framework-hunit >= 0.2 && < 0.4,
                        test-framework-quickcheck2 >= 0.2.9 && < 0.4,
-                       QuickCheck >= 2.10 && < 2.18,
+                       QuickCheck >= 2.10 && < 2.19,
                        HUnit >= 1.2 && < 1.7,
                        template-haskell >= 2
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N -Wall -O2
@@ -87,7 +85,7 @@
   main-is:         bench.hs
   hs-source-dirs:  benchmark
   build-depends:   pandoc-types,
-                   base >= 4.5 && < 5,
+                   base >= 4.15 && < 5,
                    text,
                    criterion >= 1.0
   ghc-options:   -rtsopts -Wall -fno-warn-unused-do-bind -O2
diff --git a/src/Text/Pandoc/Arbitrary.hs b/src/Text/Pandoc/Arbitrary.hs
--- a/src/Text/Pandoc/Arbitrary.hs
+++ b/src/Text/Pandoc/Arbitrary.hs
@@ -4,7 +4,6 @@
 module Text.Pandoc.Arbitrary ()
 where
 import Test.QuickCheck
-import Control.Applicative (Applicative ((<*>), pure), (<$>))
 import Control.Monad (forM)
 import Data.Text (Text)
 import qualified Data.Text as T
diff --git a/src/Text/Pandoc/Builder.hs b/src/Text/Pandoc/Builder.hs
--- a/src/Text/Pandoc/Builder.hs
+++ b/src/Text/Pandoc/Builder.hs
@@ -191,13 +191,10 @@
 import qualified Data.Text as T
 import Data.Sequence (Seq, (|>), viewr, viewl, ViewR(..), ViewL(..))
 import qualified Data.Sequence as Seq
-import Data.Traversable (Traversable)
-import Data.Foldable (Foldable)
 import qualified Data.Foldable as F
 import Data.Data
 import Control.Arrow ((***))
 import GHC.Generics (Generic)
-import Data.Semigroup (Semigroup(..))
 
 newtype Many a = Many { unMany :: Seq a }
                  deriving (Data, Ord, Eq, Typeable, Foldable, Traversable, Functor, Show, Read)
diff --git a/src/Text/Pandoc/Definition.hs b/src/Text/Pandoc/Definition.hs
--- a/src/Text/Pandoc/Definition.hs
+++ b/src/Text/Pandoc/Definition.hs
@@ -99,7 +99,6 @@
 import Control.DeepSeq
 import Paths_pandoc_types (version)
 import Data.Version (Version, versionBranch)
-import Data.Semigroup (Semigroup(..))
 import Control.Arrow (second)
 
 data Pandoc = Pandoc Meta [Block]
diff --git a/src/Text/Pandoc/Walk.hs b/src/Text/Pandoc/Walk.hs
--- a/src/Text/Pandoc/Walk.hs
+++ b/src/Text/Pandoc/Walk.hs
@@ -114,16 +114,12 @@
   , walkPandocM
   )
 where
-import Control.Applicative (Applicative ((<*>), pure), (<$>))
 import Control.Monad ((>=>))
 import Data.Functor.Identity (Identity (runIdentity))
 import qualified Data.Map as M
 import Text.Pandoc.Definition
 import qualified Data.Traversable as T
-import Data.Traversable (Traversable)
 import qualified Data.Foldable as F
-import Data.Foldable (Foldable)
-import Data.Monoid ((<>))
 
 class Walkable a b where
   -- | @walk f x@ walks the structure @x@ (bottom up) and replaces every
