diff --git a/freckle-ua-parser.cabal b/freckle-ua-parser.cabal
--- a/freckle-ua-parser.cabal
+++ b/freckle-ua-parser.cabal
@@ -1,12 +1,11 @@
 cabal-version:      1.12
 name:               freckle-ua-parser
-version:            0.1.0.2
+version:            0.1.0.3
 license:            BSD3
 license-file:       LICENSE
 copyright:          2012 Ozgun Ataman, 2026 Renaissance Learning Inc
 maintainer:         Freckle Education
 author:             Ozgun Ataman
-tested-with:        ghc ==8.6.5 ghc ==8.8.4
 homepage:           https://github.com/freckle/ua-parser#readme
 bug-reports:        https://github.com/freckle/ua-parser/issues
 synopsis:           Parsers for User-Agent strings
@@ -46,24 +45,23 @@
 library
     exposed-modules:    Web.UAParser
     hs-source-dirs:     src
-    default-language:   Haskell2010
+    default-language:   GHC2021
     default-extensions:
-        DeriveAnyClass DeriveDataTypeable DeriveGeneric NamedFieldPuns
-        NoImplicitPrelude NoMonomorphismRestriction OverloadedStrings
-        TemplateHaskell
+        DeriveAnyClass NamedFieldPuns NoImplicitPrelude
+        NoMonomorphismRestriction OverloadedStrings TemplateHaskell
 
     ghc-options:        -Wall
     build-depends:
         aeson >=0.7,
-        base >=4.14.3.0 && <5,
-        bytestring >=0.10.12.0,
-        cereal >=0.5.8.2,
+        base >=4.17.2.1 && <5,
+        bytestring >=0.11.5.3,
+        cereal >=0.5.8.3,
         cereal-text >=0.1.0.2,
         data-default >=0.7.1.1,
-        deepseq >=1.4.4.0,
+        deepseq >=1.4.8.0,
         file-embed >=0.0.15.0 && <0.1,
-        pcre-light >=0.4.1.0,
-        text >=1.2.4.1,
+        pcre-light >=0.4.1.2,
+        text >=2.0.2,
         yaml >=0.8.3
 
     if flag(lib-werror)
@@ -78,29 +76,28 @@
         Web.UAParser.SuiteUtils
         Paths_freckle_ua_parser
 
-    default-language:   Haskell2010
+    default-language:   GHC2021
     default-extensions:
-        DeriveAnyClass DeriveDataTypeable DeriveGeneric NamedFieldPuns
-        NoImplicitPrelude NoMonomorphismRestriction OverloadedStrings
-        TemplateHaskell
+        DeriveAnyClass NamedFieldPuns NoImplicitPrelude
+        NoMonomorphismRestriction OverloadedStrings TemplateHaskell
 
     ghc-options:        -Wall -O2 -fwarn-tabs
     build-depends:
         HUnit >=1.6.2.0,
         aeson >=0.7,
-        base >=4.14.3.0 && <5,
-        bytestring >=0.10.12.0,
-        cereal >=0.5.8.2,
+        base >=4.17.2.1 && <5,
+        bytestring >=0.11.5.3,
+        cereal >=0.5.8.3,
         cereal-text >=0.1.0.2,
         data-default >=0.7.1.1,
-        deepseq >=1.4.4.0,
+        deepseq >=1.4.8.0,
         file-embed >=0.0.15.0 && <0.1,
-        filepath >=1.4.2.1,
-        pcre-light >=0.4.1.0,
-        tasty >=1.4.2.1,
-        tasty-hunit >=0.10.0.3,
+        filepath >=1.4.2.2,
+        pcre-light >=0.4.1.2,
+        tasty >=1.4.3,
+        tasty-hunit >=0.10.1,
         tasty-quickcheck >=0.10.2,
-        text >=1.2.4.1,
+        text >=2.0.2,
         yaml >=0.8.3
 
     if flag(lib-werror)
@@ -115,27 +112,26 @@
         Web.UAParser.SuiteUtils
         Paths_freckle_ua_parser
 
-    default-language:   Haskell2010
+    default-language:   GHC2021
     default-extensions:
-        DeriveAnyClass DeriveDataTypeable DeriveGeneric NamedFieldPuns
-        NoImplicitPrelude NoMonomorphismRestriction OverloadedStrings
-        TemplateHaskell
+        DeriveAnyClass NamedFieldPuns NoImplicitPrelude
+        NoMonomorphismRestriction OverloadedStrings TemplateHaskell
 
     ghc-options:        -Wall -threaded -rtsopts -with-rtsopts=-N
     build-depends:
         aeson >=0.7,
-        base >=4.14.3.0 && <5,
-        bytestring >=0.10.12.0,
-        cereal >=0.5.8.2,
+        base >=4.17.2.1 && <5,
+        bytestring >=0.11.5.3,
+        cereal >=0.5.8.3,
         cereal-text >=0.1.0.2,
-        criterion >=1.5.13.0,
+        criterion >=1.6.1.0,
         data-default >=0.7.1.1,
-        deepseq >=1.4.4.0,
+        deepseq >=1.4.8.0,
         file-embed >=0.0.15.0 && <0.1,
-        filepath >=1.4.2.1,
+        filepath >=1.4.2.2,
         freckle-ua-parser,
-        pcre-light >=0.4.1.0,
-        text >=1.2.4.1,
+        pcre-light >=0.4.1.2,
+        text >=2.0.2,
         yaml >=0.8.3
 
     if flag(lib-werror)
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,5 +1,5 @@
 name: freckle-ua-parser
-version: 0.1.0.2
+version: 0.1.0.3
 synopsis: Parsers for User-Agent strings
 description: |
   Parses User-Agent strings into browser, operating system, and device details,
@@ -10,9 +10,6 @@
 copyright: 2012 Ozgun Ataman, 2026 Renaissance Learning Inc
 license: BSD3
 github: freckle/ua-parser
-tested-with:
-  - GHC == 8.6.5
-  - GHC == 8.8.4
 extra-source-files:
   - README.md
   - changelog.md
@@ -27,11 +24,10 @@
     description: Build with -Werror
     manual: true
     default: false
+language: GHC2021
 ghc-options: -Wall
 default-extensions:
   - DeriveAnyClass
-  - DeriveDataTypeable
-  - DeriveGeneric
   - NamedFieldPuns
   - NoImplicitPrelude
   - NoMonomorphismRestriction
diff --git a/src/Web/UAParser.hs b/src/Web/UAParser.hs
--- a/src/Web/UAParser.hs
+++ b/src/Web/UAParser.hs
@@ -32,8 +32,8 @@
 import Data.Serialize
 import Data.Serialize.Text ()
 import Data.Text (Text)
-import qualified Data.Text as T
-import qualified Data.Text.Encoding as T
+import Data.Text qualified as T
+import Data.Text.Encoding qualified as T
 import Data.Yaml
 import GHC.Generics
 import Text.Regex.PCRE.Light
diff --git a/src/Web/UAParser/SuiteUtils.hs b/src/Web/UAParser/SuiteUtils.hs
--- a/src/Web/UAParser/SuiteUtils.hs
+++ b/src/Web/UAParser/SuiteUtils.hs
@@ -10,11 +10,11 @@
 import Control.Applicative
 import Control.Monad (join)
 import Data.Aeson hiding ((.:?))
-import qualified Data.Aeson as A
+import Data.Aeson qualified as A
 import Data.ByteString (ByteString)
 import Data.String (fromString)
 import Data.Text (Text)
-import qualified Data.Text.Encoding as T
+import Data.Text.Encoding qualified as T
 import Data.Yaml hiding ((.:?))
 import System.FilePath
 
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -3,9 +3,9 @@
 import Prelude
 
 import Control.Applicative as A
-import qualified Data.ByteString.Char8 as B
+import Data.ByteString.Char8 qualified as B
 import Data.Monoid as M
-import qualified Data.Text as T
+import Data.Text qualified as T
 import Test.Tasty
 import Test.Tasty.HUnit
 import Web.UAParser
