diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,9 +3,17 @@
 `hslua-module-doclayout` uses [PVP Versioning][1].
 The changelog is available [on GitHub][2].
 
+## 1.0.4
+
+Released 2022-04-03.
+
+-   Allow doclayout-0.4.
+
 ## 1.0.3
 
-Release pending.
+Released 2022-02-18.
+
+-   Relaxed upper bound for hslua, allowing hslua-2.2.
 
 ## 1.0.2
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,7 +1,6 @@
 # hslua-module-doclayout
 
 [![GitHub CI][CI badge]](https://github.com/hslua/hslua-module-doclayout/actions)
-[![Build status][Travis badge]](https://travis-ci.org/hslua/hslua-module-doclayout)
 [![Hackage][Hackage badge]](https://hackage.haskell.org/package/hslua-module-doclayout)
 [![Stackage Lts][Stackage Lts badge]](http://stackage.org/lts/package/hslua-module-doclayout)
 [![Stackage Nightly][Stackage Nightly badge]](http://stackage.org/nightly/package/hslua-module-doclayout)
@@ -11,7 +10,6 @@
 
 [doclayout]: https://hackage.haskell.org/package/doclayout
 [CI badge]: https://github.com/hslua/hslua-module-doclayout/workflows/CI/badge.svg
-[Travis badge]: https://img.shields.io/travis/hslua/hslua-module-doclayout.svg?logo=travis
 [Hackage badge]: https://img.shields.io/hackage/v/hslua-module-doclayout.svg?logo=haskell
 [Stackage Lts badge]: http://stackage.org/package/hslua-module-doclayout/badge/lts
 [Stackage Nightly badge]: http://stackage.org/package/hslua-module-doclayout/badge/nightly
diff --git a/hslua-module-doclayout.cabal b/hslua-module-doclayout.cabal
--- a/hslua-module-doclayout.cabal
+++ b/hslua-module-doclayout.cabal
@@ -1,6 +1,6 @@
-cabal-version:       2.0
+cabal-version:       2.2
 name:                hslua-module-doclayout
-version:             1.0.3
+version:             1.0.4
 synopsis:            Lua module wrapping Text.DocLayout.
 description:         Lua module wrapping @Text.DocLayout@.
 homepage:            https://github.com/hslua/hslua-module-doclayout
@@ -21,20 +21,22 @@
                    , GHC == 8.6.5
                    , GHC == 8.8.4
                    , GHC == 8.10.7
-                   , GHC == 9.0.1
+                   , GHC == 9.0.2
+                   , GHC == 9.2.2
 
 source-repository head
   type:                git
   location:            https://github.com/hslua/hslua-module-doclayout.git
 
-library
-  build-depends:       base           >= 4.9 && < 5
-                     , doclayout      >= 0.2 && < 0.4
-                     , hslua          >= 2.1 && < 2.3
-                     , text           >= 1.0 && < 1.3
+common common-options
+  build-depends:       base              >= 4.9    && < 5
+                     , doclayout         >= 0.2    && < 0.5
+                     , hslua             >= 2.1    && < 2.3
+                     , text              >= 1.2    && < 2.1
+
   default-language:    Haskell2010
-  hs-source-dirs:      src
-  exposed-modules:     HsLua.Module.DocLayout
+  other-extensions:    OverloadedStrings
+                     , TypeApplications
   ghc-options:         -Wall
                        -Wcompat
                        -Widentities
@@ -50,11 +52,17 @@
   if impl(ghc >= 8.8)
     ghc-options:       -Wmissing-deriving-strategies
 
+library
+  import:              common-options
+  hs-source-dirs:      src
+  exposed-modules:     HsLua.Module.DocLayout
+  other-extensions:    CPP
+                     , FlexibleInstances
+                     , LambdaCase
+
 test-suite hslua-module-doclayout-test
-  build-depends:       base                    >= 4.9 && < 5
-                     , doclayout               >= 0.2 && < 0.4
-                     , hslua
-                     , hslua-module-doclayout
+  import:              common-options
+  build-depends:       hslua-module-doclayout
                      , tasty
                      , tasty-hunit
                      , tasty-lua               >= 1.0 && < 1.1
@@ -62,21 +70,4 @@
   hs-source-dirs:      test
   main-is:             test-hslua-module-doclayout.hs
   build-depends:       hslua-module-doclayout
-  default-language:    Haskell2010
   ghc-options:         -threaded
-                       -rtsopts
-                       -with-rtsopts=-N
-                       -Wall
-                       -Wcompat
-                       -Widentities
-                       -Wincomplete-uni-patterns
-                       -Wincomplete-record-updates
-  if impl(ghc >= 8.0)
-    ghc-options:       -Wredundant-constraints
-  if impl(ghc >= 8.2)
-    ghc-options:       -fhide-source-paths
-  if impl(ghc >= 8.4)
-    ghc-options:       -Wmissing-export-lists
-                       -Wpartial-fields
-  if impl(ghc >= 8.8)
-    ghc-options:       -Wmissing-deriving-strategies
diff --git a/test/test-doclayout.lua b/test/test-doclayout.lua
--- a/test/test-doclayout.lua
+++ b/test/test-doclayout.lua
@@ -238,7 +238,8 @@
     test('update_column', function ()
       local doc = 'long' .. doclayout.cr .. 'longer'
       assert.are_equal(doclayout.update_column(doc, 0), 6)
-      assert.are_equal(doclayout.update_column(doclayout.empty, 42), 0)
+      -- fails with doclayout < 0.4:
+      -- assert.are_equal(doclayout.update_column(doclayout.empty, 42), 42)
       assert.are_equal(doclayout.update_column('four', 4), 8)
     end)
   },
