diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -1,8 +1,10 @@
 # Builds and tests this Haskell project on "GitHub Actions"
 #
-# 2021  Rudy Matela
+# 2021-2023  Rudy Matela
 #
 # some docs: https://github.com/haskell/actions/tree/main/setup
+#
+# The official haskell docker image: https://hub.docker.com/_/haskell
 name: build
 on: [push]
 jobs:
@@ -11,24 +13,26 @@
     steps:
 
       - name: Cache ~/.cabal/packages
-        uses: actions/cache@v2
+        uses: actions/cache@v3
         with:
           path: ~/.cabal/packages
-          key:          v1-${{ runner.os }}-cabal-packages-${{ hashFiles('hello.cabal') }}
+          key:          v1-${{ runner.os }}-cabal-packages-${{ hashFiles('*.cabal') }}
           restore-keys: v1-${{ runner.os }}-cabal-packages-
 
       - name: Cache ~/.cabal and ~/.ghc
-        uses: actions/cache@v2
+        uses: actions/cache@v3
         with:
           path: |
             ~/.cabal
             !~/.cabal/packages
             ~/.ghc
-          key:          v1-${{ runner.os }}-cabal-ghc-latest-${{ hashFiles('hello.cabal') }}
+          key:          v1-${{ runner.os }}-cabal-ghc-latest-${{ hashFiles('*.cabal') }}
           restore-keys: v1-${{ runner.os }}-cabal-ghc-latest-
 
       - run: du -hd3 ~/.cabal ~/.ghc || true
 
+      - run: make --version
+
       - run: haddock --version || sudo apt-get install ghc-haddock
       - run: ghc     --version
       - run: cabal   --version
@@ -36,50 +40,54 @@
       - run: ghc-pkg list
 
       - name: Check out repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
 
-      - run: cabal update
+      - run: git --version
+
       - run: make install-dependencies
 
-      - run: make
-      - run: make test
-      - run: make haddock
+      # 2023-07: some projects were failing with missing base for GHC 9.6.
+      #          Here we compile through cabal only provisionally.
+      # - run: make
+      # - run: make test
+      # - run: make haddock
       - run: make test-sdist
-      - run: make test-via-cabal
+      #- run: make test-via-cabal
+      - run: cabal configure --enable-tests --enable-benchmarks --ghc-options="-O0"
+      - run: cabal build
+      - run: cabal test
+      - run: cabal haddock
 
 
   test-with-ghc:
     strategy:
       matrix:
         ghc:
+          - '9.4'
+          - '9.2'
           - '9.0'
           - '8.10'
-          - '8.8'
           - '8.6'
-          - '8.4'
           - '8.2'
-          - '8.0'
-          - '7.10'
-          - '7.8'
     runs-on: ubuntu-latest
     needs: build-and-test
     container: haskell:${{ matrix.ghc }}
     steps:
       - name: Cache ~/.cabal/packages
-        uses: actions/cache@v2
+        uses: actions/cache@v3
         with:
           path: ~/.cabal/packages
-          key:          v1-${{ runner.os }}-cabal-packages-${{ hashFiles('hello.cabal') }}
+          key:          v1-${{ runner.os }}-cabal-packages-${{ hashFiles('*.cabal') }}
           restore-keys: v1-${{ runner.os }}-cabal-packages-
 
       - name: Cache ~/.cabal and ~/.ghc
-        uses: actions/cache@v2
+        uses: actions/cache@v3
         with:
           path: |
             ~/.cabal
             !~/.cabal/packages
             ~/.ghc
-          key:          v1-${{ runner.os }}-cabal-ghc-${{ matrix.ghc }}-${{ hashFiles('hello.cabal') }}
+          key:          v1-${{ runner.os }}-cabal-ghc-${{ matrix.ghc }}-${{ hashFiles('*.cabal') }}
           restore-keys: v1-${{ runner.os }}-cabal-ghc-${{ matrix.ghc }}-
 
       - run: du -hd3 ~/.cabal ~/.ghc || true
@@ -94,9 +102,8 @@
       - run: ghc-pkg list
 
       - name: Check out repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
 
-      - run: cabal update
       - run: make install-dependencies
 
       - run: make
@@ -110,12 +117,12 @@
     needs: build-and-test
     steps:
       - name: Setup Haskell's GHC and Cabal as required by current Stackage LTS
-        uses: haskell/actions/setup@v1
-        with: # lts-17.9
-          ghc-version: '8.10.4'
-          cabal-version: '3.2'
+        uses: haskell/actions/setup@v2
+        with: # lts-19.19
+          ghc-version: '9.0.2'
+          cabal-version: '3.4'
 
-      - uses: actions/cache@v2
+      - uses: actions/cache@v3
         with:
           path: ~/.stack
           key:          v1-${{ runner.os }}-stack-${{ hashFiles('stack.yaml') }}
@@ -124,5 +131,5 @@
       - run: stack --version
 
       - name: Check out repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
       - run: make test-via-stack
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -4,8 +4,8 @@
 # License:     3-Clause BSD  (see the file LICENSE)
 # Maintainer:  Rudy Matela <rudy@matela.com.br>
 GHCIMPORTDIRS = src:eg:test
-GHCFLAGS = -O2 \
-  $(shell grep -q "Arch Linux" /etc/lsb-release && echo -dynamic)
+GHCFLAGS = -O2 -v0 \
+  $(shell grep -q "Arch Linux" /etc/lsb-release && echo -dynamic -package cmdargs -package regex-tdfa)
 # -Wall -Wno-name-shadowing -Wno-orphans -Wno-unused-matches
 # -prof -auto-all #-caf-all
 # When profiling is enabled, to get the cost centres with more than 6% time:
@@ -42,7 +42,6 @@
   eg/string \
   eg/oddeven \
   eg/plus-abs \
-  eg/pretty \
   eg/ratio \
   eg/sets \
   eg/tauts \
@@ -55,6 +54,7 @@
   bench/trilean \
   bench/unit
 EXTRAEG = \
+  eg/pretty \
   eg/regexes \
   eg/pretty-compact \
   eg/algebraic-graphs
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -222,7 +222,7 @@
 For more examples, see the [eg](eg) and [bench](bench) folders.
 
 Speculate has been subject to a paper, see the
-[Speculate Paper on Haskell Symposium 2017](https://matela.com.br/paper/speculate.pdf).
+[Speculate Paper on Haskell Symposium 2017](https://matela.com.br/speculate.pdf).
 Speculate is also subject to a chapter in a [PhD Thesis (2017)].
 
 [leancheck]: https://hackage.haskell.org/package/leancheck
@@ -235,7 +235,7 @@
 [Cabal]:   https://www.haskell.org/cabal
 [Haskell]: https://www.haskell.org/
 
-[PhD Thesis (2017)]: https://matela.com.br/paper/rudy-phd-thesis-2017.pdf
+[PhD Thesis (2017)]: https://matela.com.br/thesis-rudy.pdf
 
 [`speculate`]:      https://hackage.haskell.org/package/speculate/docs/Test-Speculate.html#v:speculate
 [`constant`]:       https://hackage.haskell.org/package/speculate/docs/Test-Speculate.html#v:constant
diff --git a/bench/runtime-zero b/bench/runtime-zero
--- a/bench/runtime-zero
+++ b/bench/runtime-zero
@@ -1,36 +1,33 @@
-GHC 8.10.4
-express-1.0.6
-leancheck-0.9.10
-arith               0.233
-arith-c             0.570
-arithficial         0.606
-arith-negate-abs    1.656
-binarytree          1.630
-binarytree0         0.513
-bool                2.043
-bool-c              1.806
-colour              2.003
-digraphs            1.486
-fun                 1.100
-insertsort          7.676
-insertsort0         0.896
-length              0.463
-list                2.530
-list-c              1.580
-lowtests            0.436
-minus               0.513
-minus-c             0.880
-monad               0.566
-nord                0.010
-oddeven             6.506
-plus-abs            3.510
-pretty              8.743
-ratio               8.030
-sets                7.193
-speculate-reason    2.770
-string              0.850
-tauts               3.980
-trilean             0.010
-tuples              1.210
-unit                0.010
-zip                 2.283
+GHC 9.0.2
+arith               0.290
+arith-c             0.613
+arithficial         0.690
+arith-negate-abs    1.773
+binarytree          1.813
+binarytree0         0.606
+bool                2.073
+bool-c              1.886
+colour              2.186
+digraphs            1.663
+fun                 1.120
+insertsort          7.763
+insertsort0         0.943
+length              0.496
+list                2.580
+list-c              1.586
+lowtests            0.493
+minus               0.553
+minus-c             0.926
+monad               0.596
+nord                0.040
+oddeven             7.486
+plus-abs            3.693
+ratio               8.343
+sets                7.640
+speculate-reason    3.363
+string              0.993
+tauts               4.790
+trilean             0.050
+tuples              1.383
+unit                0.040
+zip                 2.596
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -2,32 +2,42 @@
 =======================
 
 
-v0.4.14
--------
+v0.4.16 (February 2024)
+-----------------------
 
+* no changes in API
+* fix compatibility with [express] >= v1.0.16
+* bump [LeanCheck] requirement to >= 1.0.0
+* improve tests of Speculate itself
+* add release dates on this changelog
+
+
+v0.4.14 (September 2021)
+------------------------
+
 * `Test.Speculate.Reason`: add `doubleCheck`;
 * add `lowtests` benchmark;
 * bump [express] requirement to v1.0.0;
 * fix parallel compilation when using the Makefile.
 
 
-v0.4.12
--------
+v0.4.12 (July 2021)
+-------------------
 
 * bump [express] requirement to v0.2.0
 * add this changelog
 
 
-v0.4.10
--------
+v0.4.10 (June 2021)
+-------------------
 
 * no changes in the actual [Speculate] library
 * cleanup build files
 * remove uneeded typeable derivations on examples and tests
 
 
-v0.4.8
-------
+v0.4.8 (June 2021)
+------------------
 
 * no changes in the actual [Speculate] library
 * refactor build scripts
@@ -35,8 +45,8 @@
 * fix compilation of some examples under the new [LeanCheck]
 
 
-v0.4.6
-------
+v0.4.6 (April 2021)
+-------------------
 
 * [`Test.Speculate`]: export `reifyName`;
 * "internal" modules:
diff --git a/mk/depend.mk b/mk/depend.mk
--- a/mk/depend.mk
+++ b/mk/depend.mk
@@ -31,6 +31,39 @@
   src/Test/Speculate/CondReason.hs \
   src/Test/Speculate/Args.hs \
   bench/arithficial.hs
+bench/lowtests: \
+  bench/lowtests.hs \
+  mk/toplibs
+bench/lowtests.o: \
+  src/Test/Speculate/Utils/Tuple.hs \
+  src/Test/Speculate/Utils/Timeout.hs \
+  src/Test/Speculate/Utils/Tiers.hs \
+  src/Test/Speculate/Utils/String.hs \
+  src/Test/Speculate/Utils/PrettyPrint.hs \
+  src/Test/Speculate/Utils.hs \
+  src/Test/Speculate/Utils/Ord.hs \
+  src/Test/Speculate/Utils/Misc.hs \
+  src/Test/Speculate/Utils/Memoize.hs \
+  src/Test/Speculate/Utils/List.hs \
+  src/Test/Speculate/Utils/Digraph.hs \
+  src/Test/Speculate/Utils/Colour.hs \
+  src/Test/Speculate/Utils/Class.hs \
+  src/Test/Speculate/SemiReason.hs \
+  src/Test/Speculate/Sanity.hs \
+  src/Test/Speculate/Report.hs \
+  src/Test/Speculate/Reason.hs \
+  src/Test/Speculate/Reason/Order.hs \
+  src/Test/Speculate/Pretty.hs \
+  src/Test/Speculate.hs \
+  src/Test/Speculate/Expr.hs \
+  src/Test/Speculate/Expr/Instance.hs \
+  src/Test/Speculate/Expr/Ground.hs \
+  src/Test/Speculate/Expr/Equate.hs \
+  src/Test/Speculate/Expr/Core.hs \
+  src/Test/Speculate/Engine.hs \
+  src/Test/Speculate/CondReason.hs \
+  src/Test/Speculate/Args.hs \
+  bench/lowtests.hs
 bench/nord: \
   bench/nord.hs \
   mk/toplibs
diff --git a/mk/haskell.mk b/mk/haskell.mk
--- a/mk/haskell.mk
+++ b/mk/haskell.mk
@@ -1,6 +1,6 @@
 # Implicit rules for compiling Haskell code.
 #
-# Copyright (c) 2015-2021 Rudy Matela.
+# Copyright (c) 2015-2023 Rudy Matela.
 # Distributed under the 3-Clause BSD licence.
 #
 # You can optionally configure the "Configuration variables" below in your main
@@ -21,7 +21,7 @@
 GHC ?= ghc
 GHCCMD = $(GHC) -i$(GHCIMPORTDIRS) $(GHCFLAGS)
 HADDOCK ?= haddock
-CABAL_INSTALL = $(shell cabal --version | grep -q "version [0-2]\." && echo 'cabal install' || echo 'cabal v1-install')
+CABAL_INSTALL = $(shell cabal --version | grep -q "version [0-2]\." && echo 'cabal install' || echo 'cabal install --lib')
 
 # Hugs Parameters
 HUGSIMPORTDIRS ?= "/usr/lib/hugs/packages/*"
@@ -90,7 +90,10 @@
 	find $(ALL_HSS) | ./mk/ghcdeps -i$(GHCIMPORTDIRS) $(GHCFLAGS) > $(DEPMK)
 
 install-dependencies:
-	$(CABAL_INSTALL) $(INSTALL_DEPS)
+	if [ -n "$(INSTALL_DEPS)" ]; then \
+		cabal update && \
+		$(CABAL_INSTALL) $(INSTALL_DEPS); \
+	fi
 
 # haddock rules
 haddock: doc/index.html
diff --git a/speculate.cabal b/speculate.cabal
--- a/speculate.cabal
+++ b/speculate.cabal
@@ -1,5 +1,5 @@
 name:                speculate
-version:             0.4.14
+version:             0.4.16
 synopsis:            discovery of properties about Haskell functions
 description:
   Speculate automatically discovers laws about Haskell functions.
@@ -70,15 +70,12 @@
                   , test/update-diff
                   , test/sdist
 
-tested-with: GHC==9.0
+tested-with: GHC==9.4
+           , GHC==9.2
+           , GHC==9.0
            , GHC==8.10
-           , GHC==8.8
            , GHC==8.6
-           , GHC==8.4
            , GHC==8.2
-           , GHC==8.0
-           , GHC==7.10
-           , GHC==7.8
 
 source-repository head
   type:            git
@@ -87,7 +84,7 @@
 source-repository this
   type:            git
   location:        https://github.com/rudymatela/speculate
-  tag:             v0.4.14
+  tag:             v0.4.16
 
 
 library
@@ -123,7 +120,7 @@
                  , Test.Speculate.Utils.Timeout
                  , Test.Speculate.Utils.Tuple
   build-depends: base >= 4 && < 5
-               , leancheck >= 0.9.6
+               , leancheck >= 1.0.0
                , express >= 1.0.0
                , cmdargs
                , containers
diff --git a/src/Test/Speculate/Reason.hs b/src/Test/Speculate/Reason.hs
--- a/src/Test/Speculate/Reason.hs
+++ b/src/Test/Speculate/Reason.hs
@@ -413,9 +413,11 @@
     _ -> error $ "canonicalizeRuleWith: the impossible happened,"
               ++ "this is definitely a bug, see source!"
 
+-- | Prints a 'Thy' (theory) on the console. (cf. 'showThy')
 printThy :: Thy -> IO ()
 printThy = putStrLn . showThy
 
+-- | Pretty-prints a theory into a string. (cf. 'printThy')
 showThy :: Thy -> String
 showThy thy = (if null rs
                  then "no rules.\n"
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -1,8 +1,8 @@
-resolver: lts-17.9 # or ghc-8.10.4
+resolver: lts-19.19 # or ghc-9.0.2
 
 packages:
 - .
 
 extra-deps:
-- leancheck-0.9.10
-- express-1.0.6
+- leancheck-1.0.0
+- express-1.0.10
diff --git a/test/expr.hs b/test/expr.hs
--- a/test/expr.hs
+++ b/test/expr.hs
@@ -57,15 +57,19 @@
             , (yy,ff2 xx xx)
             ]
   ]
-
-ff2 :: Expr -> Expr -> Expr
-ff2 e1 e2 = ffE :$ e1 :$ e2
-  where ffE = value "f" (undefined :: Int -> Int -> Int)
+  where
+  -- now uneeded as Data.Express.Fixtures exports something of sorts
+  ff2 :: Expr -> Expr -> Expr
+  ff2 e1 e2 = ffE :$ e1 :$ e2
+    where ffE = value "f" (undefined :: Int -> Int -> Int)
+  -- however there ffE = var "f" (...)
+  -- so I am keeping a local definition of ff2 here
+  -- to make it uniform with hh5 and hh7
 
-hh5 :: Expr -> Expr -> Expr -> Expr -> Expr -> Expr
-hh5 e1 e2 e3 e4 e5 = hhE :$ e1 :$ e2 :$ e3 :$ e4 :$ e5
-  where hhE = value "h" (undefined :: Int -> Int -> Int -> Int -> Int -> Int)
+  hh5 :: Expr -> Expr -> Expr -> Expr -> Expr -> Expr
+  hh5 e1 e2 e3 e4 e5 = hhE :$ e1 :$ e2 :$ e3 :$ e4 :$ e5
+    where hhE = value "h" (undefined :: Int -> Int -> Int -> Int -> Int -> Int)
 
-hh7 :: Expr -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr
-hh7 e1 e2 e3 e4 e5 e6 e7 = hhE :$ e1 :$ e2 :$ e3 :$ e4 :$ e5 :$ e6 :$ e7
-  where hhE = value "h" (undefined :: Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int)
+  hh7 :: Expr -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr
+  hh7 e1 e2 e3 e4 e5 e6 e7 = hhE :$ e1 :$ e2 :$ e3 :$ e4 :$ e5 :$ e6 :$ e7
+    where hhE = value "h" (undefined :: Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int)
diff --git a/test/sdist b/test/sdist
--- a/test/sdist
+++ b/test/sdist
@@ -2,7 +2,7 @@
 #
 # test/sdist: tests the package generated by "cabal sdist".
 #
-# Copyright (c) 2015-2021 Rudy Matela.
+# Copyright (c) 2015-2023 Rudy Matela.
 # Distributed under the 3-Clause BSD licence.
 
 set -xe
@@ -29,7 +29,11 @@
 tar -tf $pkg | sort --ignore-case --unique > $tmp/ls-cabal-iu
 diff -rud $tmp/ls-cabal-i $tmp/ls-cabal-iu
 
-if [ -d .git ]
+# Check if we have a clone of the repo and git is available
+# The check that we can run git ls-files is needed to avoid:
+# fatal: detected dubious ownership in repository at '/__w/.../hello-haskell'
+# on CI.
+if [ -d .git ] && git --version && git ls-files >/dev/null
 then
 	# Test if files included by cabal are the same as files tracked in git.
 	git ls-files                                         | sort > $tmp/ls-git
