diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,18 @@
 
 ## unreleased
 
+## 0.1.4.0 -- 2024-06-01
+
+### Added
+
+* Test GHC 9.10
+* Support for base 4.20
+* vale linting for documentation
+
+### Deprecated
+
+* Test GHC 9.4
+
 ## 0.1.3.0 -- 2024-05-25
 
 ### Added
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
+<!-- vale RedHat.Headings = NO -->
 # template.hs
+<!-- vale RedHat.Headings = YES -->
 
 [Homepage][repository]
 
@@ -6,28 +8,29 @@
 
 ## Description
 
-You can use template.hs to create a new GitHub repository. The repository will
-have Haskell, VS Code devcontainers, and various GitHub actions ready to use.
+You can use template.hs to create a new GitHub repository. The new repository
+has Haskell, Visual Studio Code Dev Containers, and various GitHub actions
+ready to use.
 
 ## Terms of use
 
 You are free to use template.hs as a basis for your own projects without any
-conditions.  See the [LICENSE] file for details.
+conditions. See the [LICENSE] file for details.
 
 ## Prerequisites
 
-1. VS Code with "Remote Development" installed
+1. Visual Studio Code with "Remote Development" installed
 
 ## How to use this template
 
 1. Visit [the repository][repository]
 1. Click "Use this template"
 1. Follow the GitHub Docs to [Create a repo][create a repo]
-1. Open VS Code
-1. Open the command prompt (ctrl+shift+p)
-1. Type "clone repository in container" and hit return
+1. Open Visual Studio Code
+1. Open the shell prompt (Ctrl+shift+p)
+1. Type "clone repository in container" and press return
 1. Input the GitHub URL of your new repository
-1. In the resulting terminal (ctrl+\`), run: `cabal run initialise`
+1. In the resulting terminal (Ctrl+\`), run: `cabal run initialise`
 1. Browse to "Setting" -> "Actions" -> "General"
 1. Tick "Allow GitHub Actions to create and approve pull requests"
 1. Continue working on your awesome project
@@ -36,11 +39,11 @@
 
 * [LICENSE]: The license governing use of template.hs
 
-## Getting Help
+## Getting help
 
 * [GitHub Issues][issues]: Support requests, bug reports, and feature requests
 
-## How to Help
+## How to help
 
 * Submit [issues] for problems or questions
 * Submit [pull requests] for proposed changes
diff --git a/lib/initialise/Cabal.hs b/lib/initialise/Cabal.hs
--- a/lib/initialise/Cabal.hs
+++ b/lib/initialise/Cabal.hs
@@ -8,7 +8,6 @@
 module Cabal (replace, convert) where
 
 import Configuration (Configuration (..))
-import Control.Exception (Exception)
 import Control.Monad.Catch (throwM)
 import Control.Monad.Logger (logInfo)
 import Control.Monad.Reader (MonadReader (ask), asks, liftIO)
@@ -37,6 +36,7 @@
 import Prelude hiding (concat, readFile, unlines, writeFile)
 
 #if __GLASGOW_HASKELL__ < 908
+import Control.Exception (Exception)
 import Text.Parsec.Error (ParseError)
 instance Exception ParseError
 #endif
diff --git a/lib/initialise/Configuration.hs b/lib/initialise/Configuration.hs
--- a/lib/initialise/Configuration.hs
+++ b/lib/initialise/Configuration.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE ApplicativeDo #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 
@@ -15,9 +16,7 @@
 import Distribution.SPDX.LicenseId (LicenseId (Unlicense))
 import Network.URI (URI, parseURI)
 import Options.Applicative
-  ( HasValue,
-    Mod,
-    Parser,
+  ( Parser,
     auto,
     help,
     hidden,
@@ -44,97 +43,91 @@
   }
 
 parser :: Defaults -> Parser Configuration
-parser ds@(Defaults {..}) =
-  Configuration
-    <$> name
-    <*> cabalName
-    <*> homepage
-    <*> author
-    <*> maintainer
-    <*> licence
-    <*> path
-    <*> year
-    <*> verbosity
+parser ds@(Defaults {..}) = do
+  name <-
+    strOption
+      ( long "name"
+          <> help "Name of the new project."
+          <> metavar
+            "NAME"
+          <> maybeDefault (dName ds)
+      )
+  cabalName <-
+    strOption
+      ( long "cabal-name"
+          <> help "Name to use in cabal."
+          <> metavar "CABAL_NAME"
+          <> maybeDefault (dCabalName ds)
+      )
+  homepage <-
+    option
+      (maybeReader parseURI)
+      ( long "homepage"
+          <> help
+            "Homepage of the new project."
+          <> metavar "URL"
+          <> maybeDefault (dHomePage ds)
+      )
+  author <-
+    strOption
+      ( long "author"
+          <> help "Name of the author of the project."
+          <> metavar "AUTHOR"
+          <> value dAuthor
+          <> showDefault
+      )
+  maintainer <-
+    strOption
+      ( long "maintainer"
+          <> help
+            "Email of the maintainer of the project."
+          <> metavar "MAINTAINER"
+          <> value dMaintainer
+          <> showDefault
+      )
+  licence <-
+    option
+      auto
+      ( long "licence"
+          <> help "Licence of the project."
+          <> value Unlicense
+          <> showDefault
+          <> metavar "LICENCE"
+      )
+  path <-
+    option
+      auto
+      ( long "path"
+          <> help "Project path.  Only used for testing."
+          <> value dPath
+          <> showDefault
+          <> metavar "PATH"
+          <> hidden
+          <> internal
+      )
+  year <-
+    option
+      auto
+      ( long "year"
+          <> help "Copyright year.  Only used for testing."
+          <> value dYear
+          <> showDefault
+          <> metavar "YEAR"
+          <> hidden
+          <> internal
+      )
+  verbosity <-
+    option
+      auto
+      ( long "verbosity"
+          <> help
+            "Verbosity of information printed to stderr."
+          <> value LevelWarn
+          <> showDefault
+          <> metavar "VERBOSITY"
+      )
+  pure Configuration {..}
   where
-    name =
-      strOption
-        ( long "name"
-            <> help "Name of the new project."
-            <> metavar "NAME"
-            <> maybeDefault (dName ds)
-        )
-    cabalName =
-      strOption
-        ( long "cabal-name"
-            <> help "Name to use in cabal."
-            <> metavar "CABAL_NAME"
-            <> maybeDefault (dCabalName ds)
-        )
-    homepage =
-      option
-        (maybeReader parseURI)
-        ( long "homepage"
-            <> help "Homepage of the new project."
-            <> metavar "URL"
-            <> maybeDefault (dHomePage ds)
-        )
-    author =
-      strOption
-        ( long "author"
-            <> help "Name of the author of the project."
-            <> metavar "AUTHOR"
-            <> value dAuthor
-            <> showDefault
-        )
-    maintainer =
-      strOption
-        ( long "maintainer"
-            <> help "Email of the maintainer of the project."
-            <> metavar "MAINTAINER"
-            <> value dMaintainer
-            <> showDefault
-        )
-    licence =
-      option
-        auto
-        ( long "licence"
-            <> help "Licence of the project."
-            <> value Unlicense
-            <> showDefault
-            <> metavar "LICENCE"
-        )
-    path =
-      option
-        auto
-        ( long "path"
-            <> help "Project path.  Only used for testing."
-            <> value dPath
-            <> showDefault
-            <> metavar "PATH"
-            <> hidden
-            <> internal
-        )
-    year =
-      option
-        auto
-        ( long "year"
-            <> help "Copyright year.  Only used for testing."
-            <> value dYear
-            <> showDefault
-            <> metavar "YEAR"
-            <> hidden
-            <> internal
-        )
-    verbosity =
-      option
-        auto
-        ( long "verbosity"
-            <> help "Verbosity of information printed to stderr."
-            <> value LevelWarn
-            <> showDefault
-            <> metavar "VERBOSITY"
-        )
-
-maybeDefault :: (HasValue f, Show a) => Maybe a -> Mod f a
-maybeDefault (Just a) = value a <> showDefault
-maybeDefault Nothing = mempty
+    -- maybeDefault :: (HasValue f, Show a) => Maybe a -> Mod f a
+    maybeDefault (Just a) = value a <> showDefault
+    maybeDefault Nothing = mempty
diff --git a/templatise.cabal b/templatise.cabal
--- a/templatise.cabal
+++ b/templatise.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               templatise
-version:            0.1.3.0
+version:            0.1.4.0
 license:            Unlicense
 license-file:       LICENSE
 copyright:          (c) 2023 Alex Brandt
@@ -17,7 +17,9 @@
   have Haskell, VS Code devcontainers, and various GitHub actions ready to use.
 
 category:           VSCode
-tested-with:        GHC >=9.4 && <9.5 || >=9.6 && <9.7 || >=9.8 && <9.9
+tested-with:
+  GHC >=9.4 && <9.5 || >=9.6 && <9.7 || >=9.8 && <9.9 || >=9.10 && <9.11
+
 extra-source-files:
   .devcontainer/devcontainer.json
   .github/workflows/*.yml
@@ -36,7 +38,7 @@
 
 common initialise-common
   build-depends:
-    , base                  >=4.16.3.0  && <4.20
+    , base                  ^>=4.16.3.0 || ^>=4.17     || ^>=4.18     || ^>=4.19 || ^>=4.20
     , bytestring            ^>=0.11.3.1 || ^>=0.12.0.2
     , Cabal-syntax          ^>=3.8.1.0  || ^>=3.10.1.0 || ^>=3.12.0.0
     , filepath              >=1.4.2.2   && <1.6
@@ -49,6 +51,10 @@
     , text                  ^>=1.2.5.0  || ^>=2.0.1    || ^>=2.1
     , time                  ^>=1.11.1.1 || ^>=1.12.2   || ^>=1.13     || ^>=1.14
 
+  ghc-options:
+    -Wall -Werror=missing-fields -Werror=unused-imports
+    -Werror=unused-matches -Werror=unused-top-binds
+
 library initialise-library
   import:           initialise-common
   exposed-modules:
@@ -78,8 +84,8 @@
   --other-extensions:
   default-language: Haskell2010
 
-  --build-tool-depends:
-  ghc-options:      -Wall
+--build-tool-depends:
+--ghc-options:      -Wall
 
 test-suite initialise-test
   import:           initialise-common
