diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,5 @@
+2.9.9.5
+
+	* change forall to forall_ (for ghc-9.10)
+	* repair Control.Monad imports (for mtl-2.3)
+	* replace lens with microlens (has fewer dependencies)
diff --git a/satchmo.cabal b/satchmo.cabal
--- a/satchmo.cabal
+++ b/satchmo.cabal
@@ -1,7 +1,7 @@
 cabal-version:  3.0
 
 Name:           satchmo
-Version:        2.9.9.4
+Version:        2.9.9.5
 
 Author:         Pepe Iborra, Johannes Waldmann, Alexander Bau
 Maintainer:	Johannes Waldmann
@@ -11,11 +11,12 @@
                 The encoder is provided as a State monad
                 (hence the "mo" in "satchmo").
 License:        GPL-2.0-only
+Extra-Doc-Files: CHANGELOG          
 
 Category:	Logic
 build-type: Simple
 
-tested-with: GHC==8.10.7, GHC==9.0.2, GHC==9.2.4, GHC==9.4.2
+tested-with: GHC==8.10.7, GHC==9.0.2, GHC==9.2.4, GHC==9.4.2, GHC==9.6.5, GHC==9.8.4, GHC==9.10.1, GHC==9.12.1
 
 source-repository head
     type: git
@@ -27,7 +28,7 @@
     Build-depends:  mtl, process, containers, base == 4.*,
       array, bytestring, directory, minisat >= 0.1, async,
       -- memoize,
-      hashable, transformers, lens, deepseq
+      hashable, transformers, microlens, microlens-th, microlens-mtl, deepseq
     Exposed-modules:
         Satchmo.Data
         -- Satchmo.Data.Default
diff --git a/src/Satchmo/Boolean/Data.hs b/src/Satchmo/Boolean/Data.hs
--- a/src/Satchmo/Boolean/Data.hs
+++ b/src/Satchmo/Boolean/Data.hs
@@ -8,7 +8,7 @@
 module Satchmo.Boolean.Data
 
 ( Boolean(..), Booleans, encode
-, boolean, exists, forall
+, boolean, exists, forall_
 , constant
 , not, monadic
 , assertOr -- , assertOrW
@@ -31,6 +31,7 @@
 import Data.Maybe ( fromJust )
 import Data.List ( partition )
 
+import Control.Monad
 import Control.Monad.Reader
 
 import GHC.Generics (Generic)
@@ -93,12 +94,12 @@
 -}
            }
 
-forall :: MonadSAT m => m ( Boolean )
-forall = do
+forall_ :: MonadSAT m => m ( Boolean )
+forall_ = do
     x <- fresh_forall
     return $ Boolean 
            { encode = x
---           , decode = error "Boolean.forall cannot be decoded"
+--           , decode = error "Boolean.forall_ cannot be decoded"
            }
 
 constant :: MonadSAT m => Bool -> m (Boolean)
diff --git a/src/Satchmo/MonadSAT.hs b/src/Satchmo/MonadSAT.hs
--- a/src/Satchmo/MonadSAT.hs
+++ b/src/Satchmo/MonadSAT.hs
@@ -23,7 +23,9 @@
 import Control.Applicative
 import Control.Monad.Trans (lift)
 import Control.Monad.Cont  (ContT)
+#if !MIN_VERSION_mtl(2,3,0)
 import Control.Monad.List  (ListT)
+#endif
 import Control.Monad.Reader (ReaderT)
 import Control.Monad.Fix ( MonadFix )
 import qualified Control.Monad.State  as Lazy (StateT)
@@ -63,12 +65,16 @@
 -- MonadSAT liftings for standard monad transformers
 -- -------------------------------------------------------
 
+#if !MIN_VERSION_mtl(2,3,0)
+
 instance (Monad m, MonadSAT m) => MonadSAT (ListT m) where
   fresh = lift fresh
   fresh_forall = lift fresh_forall
   emit  = lift . emit
   -- emitW = (lift.) . emitW
   note = lift . note
+
+#endif
 
 instance (Monad m, MonadSAT m) => MonadSAT (ReaderT r m) where
   fresh = lift fresh
diff --git a/src/Satchmo/SAT/External.hs b/src/Satchmo/SAT/External.hs
--- a/src/Satchmo/SAT/External.hs
+++ b/src/Satchmo/SAT/External.hs
@@ -25,11 +25,14 @@
 import Satchmo.Code
 -- import Satchmo.MonadSAT
 
+import Control.Monad
 import Control.Monad.Reader
 import Control.Monad.State
 -- import Control.Monad.IO.Class
 import System.IO
-import Control.Lens
+import Lens.Micro
+import Lens.Micro.TH
+import Lens.Micro.Mtl
 import Control.Applicative
 
 import Control.Concurrent
diff --git a/src/Satchmo/SAT/Tmpfile.hs b/src/Satchmo/SAT/Tmpfile.hs
--- a/src/Satchmo/SAT/Tmpfile.hs
+++ b/src/Satchmo/SAT/Tmpfile.hs
@@ -20,6 +20,8 @@
 import Satchmo.MonadSAT
 
 import Control.Exception
+import Control.Monad
+import Control.Monad.Fix
 import Control.Monad.RWS.Strict
 import Control.Applicative
 import qualified  Data.Set as Set
