diff --git a/data-layer.cabal b/data-layer.cabal
--- a/data-layer.cabal
+++ b/data-layer.cabal
@@ -1,5 +1,5 @@
 name: data-layer
-version: 1.0.2
+version: 1.0.3
 cabal-version: >=1.10
 build-type: Simple
 license: Apache-2.0
diff --git a/src/Data/Layer/Coat.hs b/src/Data/Layer/Coat.hs
--- a/src/Data/Layer/Coat.hs
+++ b/src/Data/Layer/Coat.hs
@@ -60,13 +60,18 @@
 -- === Coat generator ===
 
 class CoatConstructor m a where constructCoat :: Uncoated a -> m a
-instance {-# OVERLAPPABLE #-} ( Monad m
-                              , CoatConstructor m (Destructed a)
+instance {-# OVERLAPPABLE #-} ( CoatConstructor m (Destructed a)
                               , Uncoated a ~ Uncoated (Destructed a)
                               , Constructor m a
-                              )       => CoatConstructor m a        where constructCoat = constructCoat >=> construct
-instance {-# OVERLAPPABLE #-} Monad m => CoatConstructor m (Coat a) where constructCoat = return . Coat
+                              , Monad m ) => CoatConstructor m a        where constructCoat = constructCoat >=> construct
+instance {-# OVERLAPPABLE #-}   Monad m   => CoatConstructor m (Coat a) where constructCoat = return . Coat
 
+class CoatDestructor m a where destructCoat :: a -> m (Uncoated a)
+instance {-# OVERLAPPABLE #-} ( Uncoated a ~ Uncoated (Destructed a)
+                              , CoatDestructor m (Destructed a)
+                              , Destructor m a
+                              , Monad m ) => CoatDestructor m a        where destructCoat = destruct >=> destructCoat
+instance {-# OVERLAPPABLE #-}   Monad m   => CoatDestructor m (Coat a) where destructCoat = return . view _Wrapped'
 
 --class Destruction m a where destroy :: a -> m (Uncoated a)
 --instance {-# OVERLAPPABLE #-} Monad m => Destruction m (Coat a) where destroy = return . unlayer
