diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## LAME 0.2.2
+
+* Maintenance release with more modern and minimal dependencies.
+
 ## LAME 0.2.1
 
 * Works with `text-2.0` and older.
diff --git a/Codec/Audio/LAME.hs b/Codec/Audio/LAME.hs
--- a/Codec/Audio/LAME.hs
+++ b/Codec/Audio/LAME.hs
@@ -23,7 +23,7 @@
   )
 where
 
-import qualified Codec.Audio.LAME.Internal as I
+import Codec.Audio.LAME.Internal qualified as I
 import Codec.Audio.Wave
 import Control.Monad
 import Control.Monad.Catch
@@ -31,7 +31,7 @@
 import Data.ByteString (ByteString)
 import Data.Maybe (fromMaybe)
 import Data.Text (Text)
-import qualified Data.Text as T
+import Data.Text qualified as T
 import Data.Word
 import System.Directory
 import System.FilePath
@@ -208,7 +208,7 @@
 -- If you feed the encoder something else, 'I.LameUnsupportedSampleFormat'
 -- will be thrown.
 encodeMp3 ::
-  MonadIO m =>
+  (MonadIO m) =>
   -- | Encoder settings
   EncoderSettings ->
   -- | WAVE file to encode
diff --git a/Codec/Audio/LAME/Internal.hs b/Codec/Audio/LAME/Internal.hs
--- a/Codec/Audio/LAME/Internal.hs
+++ b/Codec/Audio/LAME/Internal.hs
@@ -76,11 +76,11 @@
 import Codec.Audio.Wave
 import Control.Monad.Catch
 import Data.ByteString (ByteString)
-import qualified Data.ByteString as B
-import qualified Data.ByteString.Unsafe as B
+import Data.ByteString qualified as B
+import Data.ByteString.Unsafe qualified as B
 import Data.Coerce
 import Data.Text (Text)
-import qualified Data.Text.Encoding as TE
+import Data.Text.Encoding qualified as TE
 import Data.Void
 import Foreign hiding (void)
 import Foreign.C.String
@@ -493,7 +493,7 @@
 -- | Coerce to 'Ptr' and check if it's a null pointer, return 'Nothing' if
 -- it is, otherwise return the given pointer unchanged. Needless to say,
 -- this is unsafe.
-maybePtr :: Coercible a (Ptr p) => a -> Maybe a
+maybePtr :: (Coercible a (Ptr p)) => a -> Maybe a
 maybePtr a
   | coerce a == nullPtr = Nothing
   | otherwise = Just a
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,6 +0,0 @@
-module Main (main) where
-
-import Distribution.Simple
-
-main :: IO ()
-main = defaultMain
diff --git a/lame.cabal b/lame.cabal
--- a/lame.cabal
+++ b/lame.cabal
@@ -1,11 +1,11 @@
 cabal-version:      2.4
 name:               lame
-version:            0.2.1
+version:            0.2.2
 license:            BSD-3-Clause
 license-file:       LICENSE.md
 maintainer:         Mark Karpov <markkarpov92@gmail.com>
 author:             Mark Karpov <markkarpov92@gmail.com>
-tested-with:        ghc ==9.0.2 ghc ==9.2.4 ghc ==9.4.1
+tested-with:        ghc ==9.4.7 ghc ==9.6.3 ghc ==9.8.1
 homepage:           https://github.com/mrkkrp/lame
 bug-reports:        https://github.com/mrkkrp/lame/issues
 synopsis:           A high-level binding to the LAME encoder
@@ -31,49 +31,47 @@
     exposed-modules:  Codec.Audio.LAME
     c-sources:        cbits/helpers.c
     other-modules:    Codec.Audio.LAME.Internal
-    default-language: Haskell2010
+    default-language: GHC2021
     extra-libraries:  mp3lame
     include-dirs:     cbits
     build-depends:
-        base >=4.15 && <5.0,
+        base >=4.15 && <5,
         bytestring >=0.2 && <0.12,
         directory >=1.2.2 && <1.4,
         exceptions >=0.6 && <0.11,
         filepath >=1.2 && <1.5,
-        text >=2.0 && <2.1,
-        transformers >=0.4 && <0.6,
+        text >=2 && <2.2,
         wave >=0.1.2 && <0.3
 
     if flag(dev)
-        ghc-options: -Wall -Werror
+        ghc-options:
+            -Wall -Werror -Wredundant-constraints -Wpartial-fields
+            -Wunused-packages
 
     else
         ghc-options: -O2 -Wall
 
-    if flag(dev)
-        ghc-options:
-            -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns
-            -Wnoncanonical-monad-instances
-
 test-suite tests
     type:               exitcode-stdio-1.0
     main-is:            Spec.hs
-    build-tool-depends: hspec-discover:hspec-discover >=2.0 && <3.0
+    build-tool-depends: hspec-discover:hspec-discover >=2 && <3
     hs-source-dirs:     tests
     other-modules:      Codec.Audio.LAMESpec
-    default-language:   Haskell2010
+    default-language:   GHC2021
     build-depends:
-        base >=4.15 && <5.0,
+        base >=4.15 && <5,
         directory >=1.2.2 && <1.4,
         filepath >=1.2 && <1.5,
-        hspec >=2.0 && <3.0,
-        htaglib >=1.0 && <1.3,
+        hspec >=2 && <3,
+        htaglib >=1 && <1.3,
         lame,
         temporary >=1.1 && <1.4,
-        text >=2.0 && <2.1
+        text >=2 && <2.2
 
     if flag(dev)
-        ghc-options: -Wall -Werror
+        ghc-options:
+            -Wall -Werror -Wredundant-constraints -Wpartial-fields
+            -Wunused-packages
 
     else
         ghc-options: -O2 -Wall
diff --git a/tests/Codec/Audio/LAMESpec.hs b/tests/Codec/Audio/LAMESpec.hs
--- a/tests/Codec/Audio/LAMESpec.hs
+++ b/tests/Codec/Audio/LAMESpec.hs
@@ -6,7 +6,7 @@
 import Codec.Audio.LAME
 import Control.Monad
 import Data.Text (Text)
-import qualified Data.Text as T
+import Data.Text qualified as T
 import Data.Word (Word8)
 import Sound.HTagLib
 import System.Directory
