diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,7 +1,7 @@
 # Changelog for `lens-labels`
 
-## v0.2.0.3
-- Add support for ghc-8.6.
+## v0.3.0.0
+- Simplify instances to make them more readable. (#208)
 
 ## v0.2.0.2
 - Bump the lower bound on `base` to indicate we require `ghc>=8.0`.
diff --git a/lens-labels.cabal b/lens-labels.cabal
--- a/lens-labels.cabal
+++ b/lens-labels.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 19aca613bc07ce1ad3bc1d252a60d4925d35d8114ea296147ee787cfb4ed25d2
+-- hash: a0dd443748f8ccf22bcc1fa41b5d15edbecd391dc7b0a380d43a87e39fcde4f9
 
 name:           lens-labels
-version:        0.2.0.3
+version:        0.3.0.0
 synopsis:       Integration of lenses with OverloadedLabels.
 description:    Provides a framework to integrate lenses with GHC's OverloadedLabels extension.
 category:       Data
@@ -36,7 +36,7 @@
   hs-source-dirs:
       src
   build-depends:
-      base >=4.9 && <4.13
+      base >=4.9 && <4.12
     , ghc-prim >=0.4 && <0.6
     , profunctors >=5.2
     , tagged >=0.8
diff --git a/src/Lens/Labels.hs b/src/Lens/Labels.hs
--- a/src/Lens/Labels.hs
+++ b/src/Lens/Labels.hs
@@ -35,7 +35,6 @@
     Lens,
     Lens',
     -- * HasLens
-    HasLens(..),
     Proxy#,
     proxy#,
     HasLens'(..),
@@ -73,36 +72,18 @@
 type Lens s t a b = forall f . Functor f => LensLike f s t a b
 type Lens' s a = Lens s s a a
 
--- | A type class for lens fields.
-class HasLens f s t (x :: Symbol) a b
-        | x s -> a, x t -> b, x s b -> t, x t a -> s where
-    lensOf :: Proxy# x -> (a -> f b) -> s -> f t
-
 instance
-    (p ~ (a -> f b), q ~ (s -> f t), HasLens f s t x a b)
+    (Functor f, p ~ (a -> f b), q ~ (s -> f t), s ~ t, a ~ b, HasLens' s x a)
     => IsLabel x (LensFn p q) where
 #if __GLASGOW_HASKELL__ >= 802
-    fromLabel = LensFn $ lensOf (proxy# :: Proxy# x)
+    fromLabel = LensFn $ lensOf' (proxy# :: Proxy# x)
 #else
-    fromLabel p = LensFn $ lensOf p
+    fromLabel p = LensFn $ lensOf' p
 #endif
 
--- | A type class for lens fields of monomorphic types (i.e., where the lens
--- doesn't change the outer type).
---
--- This class can be used to simplify instance declarations and type
--- errors, by "forwarding" 'HasLens' to simpler instances.  For example:
---
--- @
---     instance (HasLens' f Foo x a, a ~ b) => HasLens f Foo Foo x a b where
---         where lensOf = lensOf'
---     instance Functor f => HasLens' f Foo "a" Int where ...
---     instance Functor f => HasLens' f Foo "b" Double where ...
---     instance Functor f => HasLens' f Foo "c" [Float]  where ...
---     ...
--- @
-class HasLens f s s x a a => HasLens' f s x a | x s -> a where
-    lensOf' :: Proxy# x -> (a -> f a) -> s -> f s
+-- | A type class for lens fields.
+class HasLens' s (x :: Symbol) a | s x -> a where
+    lensOf' :: Functor f => Proxy# x -> (a -> f a) -> s -> f s
 
 type ASetter s t a b = LensLike Identity s t a b
 
