diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,3 +1,6 @@
+### 0.7.4 [2023.10.05]
+* Support building with `scotty-0.20`.
+
 ### 0.7.3
 * Allow building with GHC 9.0.
 
diff --git a/Graphics/Blank.hs b/Graphics/Blank.hs
--- a/Graphics/Blank.hs
+++ b/Graphics/Blank.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE OverloadedStrings #-}
@@ -291,7 +292,7 @@
 
         -- There has to be a better way of doing this, using function, perhaps?
         get (Scotty.regex "^/(.*)$") $ do
-          fileName :: Text <- Scotty.param "1"
+          fileName :: Text <- captureParam "1"
           db <- liftIO $ atomically $ readTVar $ locals
           if fileName `S.member` db
           then do
@@ -307,6 +308,12 @@
                $ setTimeout 5
                $ defaultSettings
                ) app
+  where
+#if MIN_VERSION_scotty(0,20,0)
+    captureParam = Scotty.captureParam
+#else
+    captureParam = Scotty.param
+#endif
 
 -- | Sends a set of canvas commands to the 'Canvas'. Attempts
 -- to common up as many commands as possible. Should not crash.
diff --git a/Graphics/Blank/Canvas.hs b/Graphics/Blank/Canvas.hs
--- a/Graphics/Blank/Canvas.hs
+++ b/Graphics/Blank/Canvas.hs
@@ -48,11 +48,13 @@
         Return    :: a                           -> Canvas a
 
 instance Monad Canvas where
+#if !(MIN_VERSION_base(4,11,0))
         return = Return
+#endif
         (>>=) = Bind
 
 instance Applicative Canvas where
-  pure  = return
+  pure  = Return
   (<*>) = ap
 
 instance Functor Canvas where
diff --git a/Graphics/Blank/Utils.hs b/Graphics/Blank/Utils.hs
--- a/Graphics/Blank/Utils.hs
+++ b/Graphics/Blank/Utils.hs
@@ -60,7 +60,9 @@
     | otherwise = error "dataURLMimeType: bad parse"
  where
    (dat,rest0)       = Text.span (/= ':') txt
-   Just (_,rest1)    = Text.uncons rest0
+   rest1             = case Text.uncons rest0 of
+                         Just (_,rest1') -> rest1'
+                         Nothing         -> "dataURLMimeType: Unexpected empty Text"
    (mime_type,rest2) = Text.span (/= ';') rest1
 
 -- | Write a data URL to a given file.
diff --git a/blank-canvas.cabal b/blank-canvas.cabal
--- a/blank-canvas.cabal
+++ b/blank-canvas.cabal
@@ -1,5 +1,5 @@
 Name:                blank-canvas
-Version:             0.7.3
+Version:             0.7.4
 Synopsis:            HTML5 Canvas Graphics Library
 
 Description:      @blank-canvas@ is a Haskell binding to the complete
@@ -41,14 +41,16 @@
 Extra-source-files:  README.md
                      Changelog.md
 Cabal-version:       >= 1.10
-tested-with:         GHC == 7.8.4
-                   , GHC == 7.10.3
-                   , GHC == 8.0.2
+tested-with:         GHC == 8.0.2
                    , GHC == 8.2.2
                    , GHC == 8.4.4
                    , GHC == 8.6.5
-                   , GHC == 8.8.3
-                   , GHC == 8.10.1
+                   , GHC == 8.8.4
+                   , GHC == 8.10.7
+                   , GHC == 9.0.2
+                   , GHC == 9.2.7
+                   , GHC == 9.4.4
+                   , GHC == 9.6.1
 data-files:
     static/index.html
     static/jquery.js
@@ -75,30 +77,35 @@
                        Paths_blank_canvas
 
   default-language:    Haskell2010
-  build-depends:       aeson                 >= 0.7     && < 1.6,
+  build-depends:       aeson                 >= 1.4.4   && < 2.3,
                        base64-bytestring     >= 1.0     && < 1.3,
-                       base                  >= 4.7     && < 4.15,
-                       base-compat-batteries >= 0.10    && < 0.12,
-                       bytestring            == 0.10.*,
+                       base                  >= 4.9     && < 4.20,
+                       base-compat-batteries >= 0.10    && < 0.14,
+                       bytestring            >= 0.10    && < 0.13,
                        colour                >= 2.2     && < 2.4,
-                       containers             >= 0.5     && < 0.7,
+                       containers            >= 0.5     && < 0.8,
                        data-default-class    >= 0.0.1   && < 0.2,
                        fail                  == 4.9.*,
                        http-types            >= 0.8     && < 0.13,
                        mime-types            >= 0.1.0.3 && < 0.2,
                        kansas-comet          >= 0.4     && < 0.5,
-                       scotty                >= 0.10    && < 0.13,
+                       -- TODO: Eventually, we should bump the lower version
+                       -- bounds to >=0.20 so that we can remove some CPP in
+                       -- Graphics.Blank.
+                       scotty                >= 0.10    && < 0.21,
                        semigroups            >= 0.18    && < 1,
                        stm                   >= 2.2     && < 2.6,
-                       text                  >= 1.1     && < 1.3,
+                       text                  >= 1.1     && < 2.2,
                        text-show             >= 2       && < 4,
-                       transformers          >= 0.3     && < 0.6,
+                       transformers          >= 0.3     && < 0.7,
                        wai                   == 3.*,
                        wai-extra             >= 3.0.1   && < 3.2,
                        warp                  == 3.*,
-                       vector                >= 0.10    && < 0.13
+                       vector                >= 0.10    && < 0.14
 
   GHC-options:         -Wall
+  if impl(ghc >= 8.6)
+    ghc-options:       -Wno-star-is-type
   GHC-prof-options:    -Wall -fsimpl-tick-factor=100000
 
 source-repository head
