diff --git a/aern2-mp.cabal b/aern2-mp.cabal
--- a/aern2-mp.cabal
+++ b/aern2-mp.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           aern2-mp
-version:        0.2.7.0
+version:        0.2.8.0
 synopsis:       Multi-precision ball (interval) arithmetic
 description:    Please see the README on GitHub at <https://github.com/michalkonecny/aern2/#readme>
 category:       Math
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,7 +1,10 @@
 # Change log for aern2-mp
 
+* v 0.2.8 2021-08-04
+  * compatibility with ghc 9.0.1
+  * add limits for CN (WithCurrentPrec p (CN MPBall))
 * v 0.2.7 2021-06-02
-  * make WithCurrentPrec p (CN MPBall) a Field
+  * make (WithCurrentPrec p (CN MPBall)) a Field
   * simplify WithCurrentPrec, swap its parameters
 * v 0.2.6 2021-05-29
   * adapt to new ppow operations
diff --git a/src/AERN2/MP/Ball/Type.hs b/src/AERN2/MP/Ball/Type.hs
--- a/src/AERN2/MP/Ball/Type.hs
+++ b/src/AERN2/MP/Ball/Type.hs
@@ -146,30 +146,6 @@
       | e > 1000 = CN.noValueNumErrorPotential $ numErrorVeryInaccurate "MPBall" ""
       | otherwise = cn b
 
-instance CanTestContains MPBall MPBall where
-  contains (MPBall xLarge eLarge) (MPBall xSmall eSmall) =
-    xLargeDy - eLargeDy <= xSmallDy - eSmallDy
-    &&
-    xSmallDy + eSmallDy <= xLargeDy + eLargeDy
-    where
-    xLargeDy = dyadic xLarge
-    eLargeDy = dyadic eLarge
-    xSmallDy = dyadic xSmall
-    eSmallDy = dyadic eSmall
-
-$(declForTypes
-  [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]
-  (\ t -> [d|
-    instance CanTestContains MPBall $t where
-      contains (MPBall c e) x =
-        l <= x && x <= r
-        where
-        l = cDy - eDy
-        r = cDy + eDy
-        cDy = dyadic c
-        eDy = dyadic e
-  |]))
-
 {- ball construction/extraction functions -}
 
 instance IsInterval MPBall where
@@ -277,3 +253,28 @@
   | otherwise = -b
   where
   (l,r) = endpoints b
+
+instance CanTestContains MPBall MPBall where
+  contains (MPBall xLarge eLarge) (MPBall xSmall eSmall) =
+    xLargeDy - eLargeDy <= xSmallDy - eSmallDy
+    &&
+    xSmallDy + eSmallDy <= xLargeDy + eLargeDy
+    where
+    xLargeDy = dyadic xLarge
+    eLargeDy = dyadic eLarge
+    xSmallDy = dyadic xSmall
+    eSmallDy = dyadic eSmall
+
+$(declForTypes
+  [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]
+  (\ t -> [d|
+    instance CanTestContains MPBall $t where
+      contains (MPBall c e) x =
+        l <= x && x <= r
+        where
+        l = cDy - eDy
+        r = cDy + eDy
+        cDy = dyadic c
+        eDy = dyadic e
+  |]))
+
diff --git a/src/AERN2/MP/Enclosure.hs b/src/AERN2/MP/Enclosure.hs
--- a/src/AERN2/MP/Enclosure.hs
+++ b/src/AERN2/MP/Enclosure.hs
@@ -64,7 +64,7 @@
     where
     (c, r) = centreAsBallAndRadius v
 
-instance (IsBall t => IsBall (CN t)) where
+instance IsBall t => IsBall (CN t) where
     type CentreType (CN t) = CN (CentreType t)
     centre = fmap centre
     updateRadius f = fmap (updateRadius f)
diff --git a/src/AERN2/MP/WithCurrentPrec/Limit.hs b/src/AERN2/MP/WithCurrentPrec/Limit.hs
--- a/src/AERN2/MP/WithCurrentPrec/Limit.hs
+++ b/src/AERN2/MP/WithCurrentPrec/Limit.hs
@@ -27,6 +27,7 @@
 -- import qualified Numeric.CollectErrors as CN
 
 import GHC.TypeLits
+import Control.Monad (join)
 
 import AERN2.MP.Ball
 
@@ -42,7 +43,17 @@
     HasLimits ix (WithCurrentPrec p (CN MPBall)) 
     where
     type LimitType ix (WithCurrentPrec p (CN MPBall)) = WithCurrentPrec p (CN MPBall)
-    limit (s :: ix -> (WithCurrentPrec p (CN MPBall))) = 
+    limit s = limit $ cn . s
+
+instance 
+    (HasLimits ix (CN MPBall -> CN MPBall)
+    , LimitType ix (CN MPBall -> CN MPBall) ~ (CN MPBall -> CN MPBall)
+    , KnownNat p)
+    => 
+    HasLimits ix (CN (WithCurrentPrec p (CN MPBall)))
+    where
+    type LimitType ix (CN (WithCurrentPrec p (CN MPBall))) = WithCurrentPrec p (CN MPBall)
+    limit (s :: ix -> CN (WithCurrentPrec p (CN MPBall))) = 
         WithCurrentPrec $ limit (snop) $ sample
         where
         sample :: CN MPBall
@@ -50,4 +61,4 @@
         sampleP :: WithCurrentPrec p MPBall
         sampleP = error "sampleP is not defined, it is only a type proxy"
         snop :: ix -> (CN MPBall -> CN MPBall)
-        snop ix _sample = unWithCurrentPrec $ s ix
+        snop ix _sample = join $ fmap unWithCurrentPrec $ s ix
