diff --git a/safecopy.cabal b/safecopy.cabal
--- a/safecopy.cabal
+++ b/safecopy.cabal
@@ -7,7 +7,7 @@
 -- The package version. See the Haskell package versioning policy
 -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for
 -- standards guiding when and how versions should be incremented.
-Version:             0.5.1
+Version:             0.6.0
 
 -- A short (one-line) description of the package.
 Synopsis:            Binary serialization with version control.
@@ -61,3 +61,6 @@
   -- Build-tools:
 
   GHC-Options:         -Wall
+
+  if(impl(ghc >= 7.2.1))
+    cpp-options: -DDEFAULT_SIGNATURES
diff --git a/src/Data/SafeCopy.hs b/src/Data/SafeCopy.hs
--- a/src/Data/SafeCopy.hs
+++ b/src/Data/SafeCopy.hs
@@ -74,6 +74,7 @@
       safeGet
     , safePut
     , SafeCopy(version, kind, getCopy, putCopy)
+    , Prim(..)
     , Migrate(..)
     , Kind
     , extension
diff --git a/src/Data/SafeCopy/Instances.hs b/src/Data/SafeCopy/Instances.hs
--- a/src/Data/SafeCopy/Instances.hs
+++ b/src/Data/SafeCopy/Instances.hs
@@ -35,8 +35,15 @@
 import           System.Time (ClockTime(..), TimeDiff(..), CalendarTime(..), Month(..))
 import qualified System.Time as OT
 
+instance SafeCopy a => SafeCopy (Prim a) where
+  kind = primitive
+  getCopy = contain $
+            do e <- unsafeUnPack getCopy
+               return $ Prim e
+  putCopy (Prim e)
+    = contain $ unsafeUnPack (putCopy e)
+
 instance SafeCopy a => SafeCopy [a] where
-    kind = primitive
     getCopy = contain $
               do n <- get
                  getSafeGet >>= replicateM n
@@ -46,7 +53,6 @@
              getSafePut >>= forM_ lst
 
 instance SafeCopy a => SafeCopy (Maybe a) where
-    kind = primitive
     getCopy = contain $ do n <- get
                            if n then liftM Just safeGet
                                 else return Nothing
@@ -102,31 +108,25 @@
 
 
 instance (SafeCopy a, SafeCopy b) => SafeCopy (a,b) where
-    kind = primitive
     getCopy = contain $ liftM2 (,) safeGet safeGet
     putCopy (a,b) = contain $ safePut a >> safePut b
 instance (SafeCopy a, SafeCopy b, SafeCopy c) => SafeCopy (a,b,c) where
-    kind = primitive
     getCopy = contain $ liftM3 (,,) safeGet safeGet safeGet
     putCopy (a,b,c) = contain $ safePut a >> safePut b >> safePut c
 instance (SafeCopy a, SafeCopy b, SafeCopy c, SafeCopy d) => SafeCopy (a,b,c,d) where
-    kind = primitive
     getCopy = contain $ liftM4 (,,,) safeGet safeGet safeGet safeGet
     putCopy (a,b,c,d) = contain $ safePut a >> safePut b >> safePut c >> safePut d
 instance (SafeCopy a, SafeCopy b, SafeCopy c, SafeCopy d, SafeCopy e) =>
          SafeCopy (a,b,c,d,e) where
-    kind = primitive
     getCopy = contain $ liftM5 (,,,,) safeGet safeGet safeGet safeGet safeGet
     putCopy (a,b,c,d,e) = contain $ safePut a >> safePut b >> safePut c >> safePut d >> safePut e
 instance (SafeCopy a, SafeCopy b, SafeCopy c, SafeCopy d, SafeCopy e, SafeCopy f) =>
          SafeCopy (a,b,c,d,e,f) where
-    kind = primitive
     getCopy = contain $ (,,,,,) <$> safeGet <*> safeGet <*> safeGet <*> safeGet <*> safeGet <*> safeGet
     putCopy (a,b,c,d,e,f) = contain $ safePut a >> safePut b >> safePut c >> safePut d >>
                                       safePut e >> safePut f
 instance (SafeCopy a, SafeCopy b, SafeCopy c, SafeCopy d, SafeCopy e, SafeCopy f, SafeCopy g) =>
          SafeCopy (a,b,c,d,e,f,g) where
-    kind = primitive
     getCopy = contain $ (,,,,,,) <$> safeGet <*> safeGet <*> safeGet <*> safeGet <*>
                                      safeGet <*> safeGet <*> safeGet
     putCopy (a,b,c,d,e,f,g) = contain $ safePut a >> safePut b >> safePut c >> safePut d >>
@@ -134,55 +134,52 @@
 
 
 instance SafeCopy Int where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy Integer where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy Float where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy Double where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy L.ByteString where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy B.ByteString where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy Char where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy Word8 where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy Word16 where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy Word32 where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy Word64 where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy Ordering where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy Int8 where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy Int16 where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy Int32 where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy Int64 where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance (Integral a, SafeCopy a) => SafeCopy (Ratio a) where
-    kind = primitive;
     getCopy   = contain $ do n <- safeGet
                              d <- safeGet
                              return (n % d)
     putCopy r = contain $ do safePut (numerator   r)
                              safePut (denominator r)
 instance (HasResolution a, Fractional (Fixed a)) => SafeCopy (Fixed a) where
-    kind = primitive
     getCopy   = contain $ fromRational <$> safeGet
     putCopy   = contain . safePut . toRational
 
 instance SafeCopy () where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance SafeCopy Bool where
-    kind = primitive; getCopy = contain get; putCopy = contain . put
+    getCopy = contain get; putCopy = contain . put
 instance (SafeCopy a, SafeCopy b) => SafeCopy (Either a b) where
-    kind = primitive
     getCopy = contain $ do n <- get
                            if n then liftM Right safeGet
                                 else liftM Left safeGet
diff --git a/src/Data/SafeCopy/SafeCopy.hs b/src/Data/SafeCopy/SafeCopy.hs
--- a/src/Data/SafeCopy/SafeCopy.hs
+++ b/src/Data/SafeCopy/SafeCopy.hs
@@ -1,5 +1,11 @@
 {-# LANGUAGE GADTs, TypeFamilies, FlexibleContexts #-}
 {-# LANGUAGE ScopedTypeVariables #-}
+
+{-# LANGUAGE CPP #-}
+#ifdef DEFAULT_SIGNATURES
+{-# LANGUAGE DefaultSignatures #-}
+#endif
+
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Data.SafeCopy.SafeCopy
@@ -51,6 +57,9 @@
     Base      :: Kind a
     Extends   :: (Migrate a) => Proxy (MigrateFrom a) -> Kind a
 
+-- | Wrapper for data that was saved without a version tag.
+newtype Prim a = Prim { getPrimitive :: a }
+
 -- | The centerpiece of this library. Defines a version for a data type
 --   together with how it should be serialized/parsed.
 --
@@ -100,6 +109,13 @@
             proxy = proxyFromConsistency ret
         in ret
 
+#ifdef DEFAULT_SIGNATURES
+    default getCopy :: Serialize a => Contained (Get a)
+    getCopy = contain get
+
+    default putCopy :: Serialize a => a -> Contained Put
+    putCopy = contain . put
+#endif
 
 
 constructGetterFromVersion :: SafeCopy a => Version a -> Proxy a -> Get a
