diff --git a/mealy.cabal b/mealy.cabal
--- a/mealy.cabal
+++ b/mealy.cabal
@@ -1,6 +1,6 @@
-cabal-version: 2.4
+cabal-version: 3.0
 name:          mealy
-version:       0.4.2
+version:       0.4.3
 license:       BSD-3-Clause
 copyright:     Tony Day (c) 2013 - 2022
 maintainer:    tonyday567@gmail.com
@@ -11,44 +11,107 @@
 description:
   @mealy@ provides support for computing statistics (such as an average or a standard deviation)
   as current state. Usage is to supply a decay function representing the relative weights of recent values versus older ones, in the manner of exponentially-weighted averages. The library attempts to be polymorphic in the statistic which can be combined in applicative style.
-  .
+
   == Usage
-  .
+
   >>> import Mealy
-  .
+
   >>> fold ((,) <$> ma 0.9 <*> std 0.9) [1..100]
   (91.00265621044142,9.472822805289121)
 
 category:      folding
 build-type:    Simple
-tested-with:   GHC ==8.6.5 || ==8.8.4 || ==8.10.7 || ==9.2.5 || ==9.4.4
+tested-with:   GHC == 8.10.7 || ==9.2.8 || ==9.4.5 || ==9.6.2
 
 source-repository head
   type:     git
   location: https://github.com/tonyday567/mealy
 
+common ghc2021-stanza
+  if impl(ghc >=9.2)
+    default-language:
+      GHC2021
+  if impl(ghc <9.2)
+    default-language:
+      Haskell2010
+    default-extensions:
+      BangPatterns
+      BinaryLiterals
+      ConstrainedClassMethods
+      ConstraintKinds
+      DeriveDataTypeable
+      DeriveFoldable
+      DeriveFunctor
+      DeriveGeneric
+      DeriveLift
+      DeriveTraversable
+      DoAndIfThenElse
+      EmptyCase
+      EmptyDataDecls
+      EmptyDataDeriving
+      ExistentialQuantification
+      ExplicitForAll
+      FlexibleContexts
+      FlexibleInstances
+      ForeignFunctionInterface
+      GADTSyntax
+      GeneralisedNewtypeDeriving
+      HexFloatLiterals
+      ImplicitPrelude
+      InstanceSigs
+      KindSignatures
+      MonomorphismRestriction
+      MultiParamTypeClasses
+      NamedFieldPuns
+      NamedWildCards
+      NumericUnderscores
+      PatternGuards
+      PolyKinds
+      PostfixOperators
+      RankNTypes
+      RelaxedPolyRec
+      ScopedTypeVariables
+      StandaloneDeriving
+      StarIsType
+      TraditionalRecordSyntax
+      TupleSections
+      TypeApplications
+      TypeOperators
+      TypeSynonymInstances
+  if impl(ghc <9.2) && impl(ghc >=8.10)
+    default-extensions:
+      ImportQualifiedPost
+      StandaloneKindSignatures
+
+common ghc-options-stanza
+  ghc-options:
+    -Wall
+    -Wcompat
+    -Wincomplete-record-updates
+    -Wincomplete-uni-patterns
+    -Wredundant-constraints
+    -Widentities
+    -Wpartial-fields
+
 library
+  import: ghc2021-stanza
+  import: ghc-options-stanza
   exposed-modules:
     Data.Mealy
     Data.Mealy.Quantiles
     Data.Mealy.Simulate
 
   hs-source-dirs:   src
-  default-language: Haskell2010
-  ghc-options:
-    -Wall -Wcompat -Wincomplete-record-updates
-    -Wincomplete-uni-patterns -Wredundant-constraints
-
   build-depends:
     , adjunctions        ^>=4.4
     , base               >=4.12   && <5
     , containers         ^>=0.6.2
     , mwc-probability    ^>=2.3.1
-    , numhask            ^>=0.10
-    , numhask-array      ^>=0.10.1
+    , numhask            >=0.10 && <0.12
+    , numhask-array      >=0.10.1 && <0.12
     , primitive          >=0.7.2   && <0.9
     , profunctors        ^>=5.6.2
-    , tdigest            ^>=0.2.1
+    , tdigest            >=0.2.1 && <4
     , text               >=1.2.4   && <2.1
     , vector             >=0.12.3  && <0.14
     , vector-algorithms  >=0.8.0   && <0.10
diff --git a/src/Data/Mealy.hs b/src/Data/Mealy.hs
--- a/src/Data/Mealy.hs
+++ b/src/Data/Mealy.hs
@@ -1,25 +1,8 @@
-{-# LANGUAGE ConstraintKinds #-}
 {-# LANGUAGE DataKinds #-}
-{-# LANGUAGE DeriveFunctor #-}
-{-# LANGUAGE DerivingVia #-}
-{-# LANGUAGE DuplicateRecordFields #-}
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE GADTs #-}
-{-# LANGUAGE KindSignatures #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE PatternSynonyms #-}
-{-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE StrictData #-}
-{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE NoImplicitPrelude #-}
-{-# OPTIONS_GHC -Wall #-}
-{-# OPTIONS_GHC -Wno-incomplete-patterns #-}
-{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
-{-# OPTIONS_GHC -Wno-name-shadowing #-}
-{-# OPTIONS_GHC -Wno-orphans #-}
-{-# OPTIONS_GHC -Wno-type-defaults #-}
 
 -- | Online statistics for ordered data (such as time-series data), modelled as [mealy machines](https://en.wikipedia.org/wiki/Mealy_machine)
 module Data.Mealy
@@ -72,7 +55,7 @@
 import Data.List (scanl')
 import Data.Profunctor
 import Data.Sequence (Seq)
-import qualified Data.Sequence as Seq
+import Data.Sequence qualified as Seq
 import Data.Text (Text)
 import Data.Typeable (Typeable)
 import GHC.TypeLits
@@ -176,6 +159,7 @@
 
 {-# COMPLETE M #-}
 
+-- | Create a Mealy from a (pure) function
 dipure :: (a -> a -> a) -> Mealy a a
 dipure f = M id f id
 
@@ -273,7 +257,7 @@
 --
 -- >>> fold (absma 1) xs0
 -- 0.8075705557429647
-absma :: (Divisive a, Signed a) => a -> Mealy a a
+absma :: (Divisive a, Absolute a) => a -> Mealy a a
 absma r = online abs (* r)
 {-# INLINEABLE absma #-}
 
@@ -420,12 +404,12 @@
     -- extract :: Averager (RegressionState n a) a -> (F.Array '[n] a)
     extract (A (RegressionState xx x xy y) c) =
       (\a b -> recip a `F.mult` b)
-        ((one / c) .* (xx - F.expand (*) x x))
-        ((xy - (y .* x)) *. (one / c))
+        ((one / c) *| (xx - F.expand (*) x x))
+        ((xy - (y *| x)) |* (one / c))
     step x (xs, y) = rsOnline r x (inject (xs, y))
     -- inject :: (F.Array '[n] a, a) -> Averager (RegressionState n a) a
     inject (xs, y) =
-      A (RegressionState (F.expand (*) xs xs) xs (y .* xs) y) one
+      A (RegressionState (F.expand (*) xs xs) xs (y *| xs) y) one
 {-# INLINEABLE beta #-}
 
 rsOnline :: (Field a, KnownNat n) => a -> Averager (RegressionState n a) a -> Averager (RegressionState n a) a -> Averager (RegressionState n a) a
@@ -519,7 +503,7 @@
 
 -- | onlineL1' takes a function and turns it into a `Mealy` where the step is an incremental update of an (isomorphic) median statistic.
 onlineL1 ::
-  (Ord b, Field b, Signed b) => b -> b -> (a -> b) -> (b -> b) -> Mealy a b
+  (Ord b, Field b, Absolute b) => b -> b -> (a -> b) -> (b -> b) -> Mealy a b
 onlineL1 i d f g = snd <$> M inject step extract
   where
     inject a = let s = abs (f a) in Medianer s one (i * s)
@@ -543,6 +527,6 @@
 -- | moving median
 -- > L.fold (maL1 inc d r) [1..n]
 -- 93.92822312742108
-maL1 :: (Ord a, Field a, Signed a) => a -> a -> a -> Mealy a a
+maL1 :: (Ord a, Field a, Absolute a) => a -> a -> a -> Mealy a a
 maL1 i d r = onlineL1 i d id (* r)
 {-# INLINEABLE maL1 #-}
diff --git a/src/Data/Mealy/Quantiles.hs b/src/Data/Mealy/Quantiles.hs
--- a/src/Data/Mealy/Quantiles.hs
+++ b/src/Data/Mealy/Quantiles.hs
@@ -1,6 +1,5 @@
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE RebindableSyntax #-}
-{-# LANGUAGE StrictData #-}
 
 -- | Mealy quantile statistics.
 module Data.Mealy.Quantiles
@@ -16,8 +15,8 @@
 import Data.TDigest hiding (median)
 import Data.TDigest.Internal
 import Data.TDigest.Tree.Internal (TDigest (..), absMaxSize, emptyTDigest, insertCentroid, relMaxSize, size, toMVector)
-import qualified Data.Vector.Algorithms.Heap as VHeap
-import qualified Data.Vector.Unboxed as VU
+import Data.Vector.Algorithms.Heap qualified as VHeap
+import Data.Vector.Unboxed qualified as VU
 import NumHask.Prelude hiding (fold)
 
 data OnlineTDigest = OnlineTDigest
diff --git a/src/Data/Mealy/Simulate.hs b/src/Data/Mealy/Simulate.hs
--- a/src/Data/Mealy/Simulate.hs
+++ b/src/Data/Mealy/Simulate.hs
@@ -1,10 +1,4 @@
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE ExtendedDefaultRules #-}
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE NoImplicitPrelude #-}
-{-# OPTIONS_GHC -Wall #-}
-{-# OPTIONS_GHC -fno-warn-type-defaults #-}
 
 -- | simulation to support testing of Mealy's using mwc-probability
 module Data.Mealy.Simulate
