diff --git a/changelog.md b/changelog.md
deleted file mode 100644
--- a/changelog.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Changelog
-
-## v1.0.0.0 - October 20, 2020
-
-Initial version
-
-## v1.0.0.1 - March 9, 2021
-
-Support for GHC 9.0, although the test suite doesn't run yet;
-waiting for other dependencies to support GHC 9.0 as well.
-
-Support `bytestring-0.11`
-
-Remove the `doctest` test suite; moved everything into the
-`hedgehog` suite.
-
-## v1.0.0.2 - August 9, 2021
-
-Rename the test executable to support case-insensitive file systems
diff --git a/dsv.cabal b/dsv.cabal
--- a/dsv.cabal
+++ b/dsv.cabal
@@ -1,14 +1,13 @@
-cabal-version: 2.4
+cabal-version: 3.0
 
 name: dsv
-version: 1.0.0.2
+version: 1.0.0.3
 category: Text, CSV, Pipes
 synopsis: DSV (delimiter-separated values)
 
 description:
     Utilities for working with DSV (delimiter-separated values) files.
 
-extra-source-files: changelog.md
 data-files:
     test-data/tweets.csv
   , test-data/tweets-with-id-error.csv
@@ -30,14 +29,29 @@
 author:     Chris Martin
 maintainer: Chris Martin, Julie Moronuki
 
-library
-    hs-source-dirs: library
+common base
     default-language: Haskell2010
+    ghc-options: -Wall
 
-    ghc-options:
-        -Wall
-        -fdefer-typed-holes
+    build-depends:
+        attoparsec ^>= 0.13 || ^>= 0.14
+      , base ^>= 4.12 || ^>= 4.13 || ^>= 4.14 || ^>= 4.15 || ^>= 4.16
+      , bytestring ^>= 0.10 || ^>= 0.11
+      , cassava ^>= 0.5
+      , containers ^>= 0.6
+      , foldl ^>= 1.4.5
+      , pipes ^>= 4.3.10
+      , pipes-bytestring ^>= 2.1
+      , pipes-safe ^>= 2.3
+      , template-haskell ^>= 2.14 || ^>= 2.15 || ^>= 2.16 || ^>= 2.17 || ^>= 2.18
+      , text ^>= 1.2
+      , validation ^>= 1.1
+      , vector ^>= 0.12
 
+library
+    import: base
+    hs-source-dirs: library
+
     exposed-modules:
         DSV
 
@@ -91,50 +105,28 @@
       , DSV.ZipViewPipe
       , DSV.ZipViewStop
 
-    build-depends:
-        attoparsec ^>= 0.13
-      , base ^>= 4.12 || ^>= 4.13 || ^>= 4.14 || ^>= 4.15
-      , bytestring ^>= 0.10 || ^>= 0.11
-      , cassava ^>= 0.5
-      , containers ^>= 0.6
-      , foldl ^>= 1.4.5
-      , pipes ^>= 4.3.10
-      , pipes-bytestring ^>= 2.1
-      , pipes-safe ^>= 2.3
-      , template-haskell ^>= 2.14 || ^>= 2.15 || ^>= 2.16 || ^>= 2.17
-      , text ^>= 1.2
-      , validation ^>= 1.1
-      , vector ^>= 0.12
-
-test-suite hedgehog
-  type: exitcode-stdio-1.0
-  default-language: Haskell2010
-  hs-source-dirs: test
-  main-is: test-with-hedgehog.hs
+test-suite test-dsv
+    import: base
+    type: exitcode-stdio-1.0
+    default-language: Haskell2010
+    hs-source-dirs: test
+    main-is: test-with-hedgehog.hs
 
-  ghc-options:
-      -Wall
-      -fno-warn-missing-signatures
-      -threaded
+    ghc-options:
+        -fno-warn-missing-signatures
+        -threaded
 
-  other-modules:
-      Paths_dsv
-    , DSV.TestPrelude
-    , DSV.TestData.Tweets
-    , DSV.Tests.FileFoldCsv
-    , DSV.Tests.FileStrictCsvRead
-    , DSV.Tests.FileStrictCsvZipView
-    , DSV.Tests.Header
-    , DSV.Tests.NumberViews
+    other-modules:
+        Paths_dsv
+      , DSV.TestPrelude
+      , DSV.TestData.Tweets
+      , DSV.Tests.FileFoldCsv
+      , DSV.Tests.FileStrictCsvRead
+      , DSV.Tests.FileStrictCsvZipView
+      , DSV.Tests.Header
+      , DSV.Tests.NumberViews
 
-  build-depends:
-      dsv
-    , base ^>= 4.12 || ^>= 4.13 || ^>= 4.14 || ^>= 4.15
-    , bytestring ^>= 0.10 || ^>= 0.11
-    , containers ^>= 0.6
-    , foldl ^>= 1.4
-    , hedgehog ^>= 1.0
-    , pipes ^>= 4.3.10
-    , safe-exceptions ^>= 0.1
-    , text ^>= 1.2
-    , vector ^>= 0.12
+    build-depends:
+        dsv
+      , hedgehog ^>= 1.0 || ^>= 1.1
+      , safe-exceptions ^>= 0.1
