diff --git a/hexpat-lens.cabal b/hexpat-lens.cabal
--- a/hexpat-lens.cabal
+++ b/hexpat-lens.cabal
@@ -1,5 +1,5 @@
 name:                hexpat-lens
-version:             0.0.7
+version:             0.1.0
 synopsis:            Lenses for Hexpat.
 license:             MIT
 license-file:        LICENSE
@@ -22,7 +22,7 @@
     , deepseq         >= 1.3      && < 1.4
     , bytestring      >= 0.10.0.2 && < 0.10.1
     , hexpat          >= 0.20     && < 0.21
-    , lens            >= 3.9      && < 3.10
+    , lens            >= 4.0.7    && < 4.1
     , hexpat-tagsoup  == 0.1.*
   ghc-options: -Wall
   hs-source-dirs:      src
diff --git a/src/Text/XML/Expat/Lens/Generic.hs b/src/Text/XML/Expat/Lens/Generic.hs
--- a/src/Text/XML/Expat/Lens/Generic.hs
+++ b/src/Text/XML/Expat/Lens/Generic.hs
@@ -88,13 +88,9 @@
       {-# INLINE ins #-}
   {-# INLINE at #-}
 
-instance (Eq tag, Applicative f) => Ixed f (NodeG c tag text) where
-  ix = ixAt
-
-instance (Eq tag, Applicative f, Contravariant f)
-         => Contains f (NodeG c tag text) where
-  contains = containsAt
-
+instance (Eq tag) => Ixed (NodeG c tag text) where
+   ix = ixAt
+   
 instance Traversable f => Plated (NodeG f tag text) where
   plate = children . traverse
   {-# INLINE plate #-}
@@ -137,18 +133,17 @@
 -- 'Control.Lens.Fold.filtered' so the caveats there apply.
 
 -- | Traverses 'Element's which have a particular name.
-
 named
-  :: (Choice p, Applicative f, Eq tag)
-     => tag -> Overloaded' p f (NodeG c tag text) (NodeG c tag text)
+  :: (Eq a, Applicative f, Choice p) =>
+     a -> Optic' p f (NodeG f1 a text) (NodeG f1 a text)
 named n = filtered $ maybe False (== n) . preview name
 {-# INLINE named #-}
 
 -- | @parameterized k v@ traverses 'Element's which match the value
 -- @v@ at the key @k@ in their attributes.
-
-parameterized :: (Choice p, Applicative f, Eq tag, Eq text) =>
-                 tag -> text -> Overloaded' p f (NodeG c tag text) (NodeG c tag text)
+parameterized
+  :: (Eq (IxValue a), Applicative f, Choice p, Ixed a) =>
+     Index a -> IxValue a -> Optic' p f a a
 parameterized k v = filtered check where
   check u = case u ^? ix k . to (==v) of
     Just True -> True
diff --git a/src/Text/XML/Expat/Lens/Unqualified.hs b/src/Text/XML/Expat/Lens/Unqualified.hs
--- a/src/Text/XML/Expat/Lens/Unqualified.hs
+++ b/src/Text/XML/Expat/Lens/Unqualified.hs
@@ -19,7 +19,7 @@
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeSynonymInstances #-}
-{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE RankNTypes #-}
 
 module Text.XML.Expat.Lens.Unqualified (
@@ -60,12 +60,15 @@
 allNodes = G.allNodes
 {-# INLINE allNodes #-}
 
-named :: (Choice p, Applicative f, Eq t) => t -> Overloaded' p f (UNode t) (UNode t)
+named
+  :: (Eq a, Applicative f, Choice p) =>
+     a -> Optic' p f (NodeG f1 a text) (NodeG f1 a text)
 named = G.named
 {-# INLINE named #-}
-
-parameterized :: (Choice p, Applicative f, Eq t, GenericXMLString t) =>
-                 t -> t -> Overloaded' p f (UNode t) (UNode t)
+                                                            
+parameterized
+  :: (Eq (IxValue a),  Applicative f, Choice p, Ixed a) =>
+     Index a -> IxValue a -> Optic' p f a a
 parameterized = G.parameterized
 {-# INLINE parameterized #-}
 
