diff --git a/control-iso.cabal b/control-iso.cabal
--- a/control-iso.cabal
+++ b/control-iso.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                control-iso
-version:             0.1.0.1
+version:             0.1.0.2
 synopsis: A typeclass for type isomorphisms
 description: This is a type class for type isomorphisms, it provides string conversions as well as for newtypes and common types
 license:             BSD3
@@ -24,10 +24,10 @@
   -- other-modules:
   -- other-extensions:
   ghc-options: -Wall
-  build-depends:       base                >= 4.9 && <4.12
+  build-depends:       base                >= 4.9 && <4.13
                      , bytestring          >= 0.10.8 && < 0.11
                      , newtype-generics    >= 0.5.1 && < 0.6
-                     , profunctors         >= 5.2.1 && < 5.3
+                     , profunctors         >= 5.2.1 && < 5.4
                      , text                >= 1.2.2 && < 1.3
 
   hs-source-dirs:      src
diff --git a/src/Control/Isomorphic.hs b/src/Control/Isomorphic.hs
--- a/src/Control/Isomorphic.hs
+++ b/src/Control/Isomorphic.hs
@@ -11,8 +11,10 @@
 {-# LANGUAGE TypeFamilyDependencies  #-}
 {-# LANGUAGE UndecidableSuperClasses #-}
 
+
 module Control.Isomorphic where
 
+
 import           Control.Applicative
 import           Control.Arrow
 import qualified Control.Monad.ST.Lazy      as SL
@@ -22,6 +24,7 @@
 import qualified Data.ByteString.Char8      as BSC
 import qualified Data.ByteString.Lazy       as BL
 import qualified Data.ByteString.Lazy.Char8 as BLC
+import           Data.Coerce
 import           Data.Fixed
 import           Data.Functor.Compose
 import           Data.Functor.Identity
@@ -260,39 +263,73 @@
    to' _                   = False
 
 instance Isomorphic (WrappedMonad m a) (m a) where to' = N.unpack
+                                                   {-# INLINE to' #-}
 instance Isomorphic (m a) (WrappedMonad m a) where to' = N.pack
+                                                   {-# INLINE to' #-}
 instance Isomorphic (WrappedArrow a b c) (a b c) where to' = N.unpack
+                                                       {-# INLINE to' #-}
 instance Isomorphic (a b c) (WrappedArrow a b c) where to' = N.pack
+                                                       {-# INLINE to' #-}
 instance Isomorphic (ZipList a) [a] where to' = N.unpack
+                                          {-# INLINE to' #-}
 instance Isomorphic [a] (ZipList a) where to' = N.pack
+                                          {-# INLINE to' #-}
 instance Isomorphic (Kleisli m a b) (a -> m b) where to' = N.unpack
+                                                     {-# INLINE to' #-}
 instance Isomorphic (a -> m b) (Kleisli m a b) where to' = N.pack
+                                                     {-# INLINE to' #-}
 instance Isomorphic (ArrowMonad a b) (a () b) where to' = N.unpack
+                                                    {-# INLINE to' #-}
 instance Isomorphic (a () b) (ArrowMonad a b) where to' = N.pack
+                                                    {-# INLINE to' #-}
 instance Isomorphic (Fixed a) Integer where to' = N.unpack
+                                            {-# INLINE to' #-}
 instance Isomorphic Integer (Fixed a) where to' = N.pack
+                                            {-# INLINE to' #-}
 instance Isomorphic (Compose f g a) (f (g a)) where to' = N.unpack
+                                                    {-# INLINE to' #-}
 instance Isomorphic (f (g a)) (Compose f g a) where to' = N.pack
+                                                    {-# INLINE to' #-}
 instance Isomorphic (Const a x) a where to' = N.unpack
+                                        {-# INLINE to' #-}
 instance Isomorphic a (Const a x) where to' = N.pack
+                                        {-# INLINE to' #-}
 instance Isomorphic (Identity a) a where to' = N.unpack
+                                         {-# INLINE to' #-}
 instance Isomorphic a (Identity a) where to' = N.pack
+                                         {-# INLINE to' #-}
 instance Isomorphic (Dual a) a where to' = N.unpack
+                                     {-# INLINE to' #-}
 instance Isomorphic a (Dual a) where to' = N.pack
+                                     {-# INLINE to' #-}
 instance Isomorphic (Endo a) (a -> a) where to' = N.unpack
+                                            {-# INLINE to' #-}
 instance Isomorphic (a -> a) (Endo a) where to' = N.pack
+                                            {-# INLINE to' #-}
 instance Isomorphic All Bool where to' = N.unpack
+                                   {-# INLINE to' #-}
 instance Isomorphic Bool All where to' = N.pack
+                                   {-# INLINE to' #-}
 instance Isomorphic Any Bool where to' = N.unpack
+                                   {-# INLINE to' #-}
 instance Isomorphic Bool Any where to' = N.pack
+                                   {-# INLINE to' #-}
 instance Isomorphic (Sum a) a where to' = N.unpack
+                                    {-# INLINE to' #-}
 instance Isomorphic a (Sum a) where to' = N.pack
+                                    {-# INLINE to' #-}
 instance Isomorphic (Product a) a where to' = N.unpack
+                                        {-# INLINE to' #-}
 instance Isomorphic a (Product a) where to' = N.pack
+                                        {-# INLINE to' #-}
 instance Isomorphic (First a) (Maybe a) where to' = N.unpack
+                                              {-# INLINE to' #-}
 instance Isomorphic (Maybe a) (First a) where to' = N.pack
+                                              {-# INLINE to' #-}
 instance Isomorphic (Last a) (Maybe a) where to' = N.unpack
+                                             {-# INLINE to' #-}
 instance Isomorphic (Maybe a) (Last a) where to' = N.pack
+                                             {-# INLINE to' #-}
 
 -- | lift a function to any types to which it is isomorphic
 as :: (Isomorphic b d, Isomorphic c a) => (a -> b) -> c -> d
@@ -309,3 +346,12 @@
 -- | A free lens @Iso s t a b@ from the `Isomorphic` instances
 isoBi :: (Profunctor p, Isomorphic s a, Isomorphic b t, Functor f) => p a (f b) -> p s (f t)
 isoBi = dimap to (fmap to)
+
+
+instance {-# OVERLAPPABLE #-} Coercible a b => Isomorphic a b where to' = coerce
+                                                                    {-# INLINE to' #-}
+
+instance (Functor f, Isomorphic a b) => Isomorphic (f a) (f b) where to' = fmap to
+-- instance (Functor f, Functor g, Isomorphic a b) => Isomorphic (g (f a)) (g (f b)) where to' = (fmap . fmap) to
+-- instance (Functor f, Functor g, Functor h, Isomorphic a b) => Isomorphic (h (g (f a))) (h (g (f b))) where to' = (fmap . fmap . fmap) to
+-- instance (Functor f, Functor g, Functor h, Functor k, Isomorphic a b) => Isomorphic (k (h (g (f a)))) (k (h (g (f b)))) where to' = (fmap . fmap . fmap . fmap) to
