diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,8 @@
+0.3
+---
+* Instances for `SafeCopy`, `Binary` and `Cereal`
+* Added `insert'`
+
 0.2
 ---
 * Generalized Autoincrement
diff --git a/src/Data/Table.hs b/src/Data/Table.hs
--- a/src/Data/Table.hs
+++ b/src/Data/Table.hs
@@ -52,6 +52,7 @@
   , Withal(..)
   , Group(..)
   , insert
+  , insert'
   , delete
   , rows
   , rows'
@@ -75,6 +76,8 @@
 import Control.Lens
 import Control.Monad
 import Control.Monad.Fix
+import Data.Binary (Binary)
+import qualified Data.Binary as B
 import Data.Data
 import Data.Foldable as F
 import Data.Function (on)
@@ -92,6 +95,9 @@
 import qualified Data.Map as M
 import Data.Maybe
 import Data.Monoid
+import Data.SafeCopy (SafeCopy(..), safeGet, safePut, contain)
+import Data.Serialize (Serialize)
+import qualified Data.Serialize as C
 import Data.Set (Set)
 import qualified Data.Set as S
 import Data.Traversable
@@ -192,6 +198,21 @@
   dataTypeOf _ = tableDataType
   dataCast1 f = gcast1 f
 
+instance (Tabular t, Binary t) => Binary (Table t) where
+  put = reviews table B.put
+  get = view table <$> B.get
+
+instance (Tabular t, Serialize t) => Serialize (Table t) where
+  put = reviews table C.put
+  get = view table <$> C.get
+
+instance (Typeable t, Tabular t, SafeCopy t) => SafeCopy (Table t) where
+  putCopy = contain . reviews table safePut
+  getCopy = contain $ view table <$> safeGet
+  errorTypeName pt = show $ typeOf (undefined `asProxyTypeOf` pt)
+    where asProxyTypeOf :: a -> p a -> a
+          asProxyTypeOf a _ = a
+
 fromListConstr :: Constr
 fromListConstr = mkConstr tableDataType "fromList" [] Prefix
 
@@ -334,13 +355,17 @@
 
 -- | Insert a row into a relation, removing collisions.
 insert :: Tabular t => t -> Table t -> Table t
-insert t0 r = case autoTab t0 of
+insert t r = snd $ insert' t r
+
+-- | Insert a row into a relation, removing collisions.
+insert' :: Tabular t => t -> Table t -> (t, Table t)
+insert' t0 r = case autoTab t0 of
   Just p -> case r of
     EmptyTable -> go (p emptyTab)
     Table m    -> go (p m)
   Nothing -> go t0
   where
-  go t = case delete t r of
+  go t = (,) t $ case delete t r of
     EmptyTable -> singleton t
     Table m -> Table $ runIdentity $ forTab m $ \k i -> Identity $ case i of
       PrimaryMap idx          -> primarily k $ PrimaryMap $ idx & at (fetch k t) ?~ t
diff --git a/tables.cabal b/tables.cabal
--- a/tables.cabal
+++ b/tables.cabal
@@ -1,6 +1,6 @@
 name:          tables
 category:      Data, Lenses
-version:       0.2
+version:       0.3
 license:       BSD3
 cabal-version: >= 1.8
 license-file:  LICENSE
@@ -44,11 +44,14 @@
 library
   build-depends:
     base                 >= 4.3 && < 5,
+    binary               >= 0.5 && < 0.6,
+    cereal               >= 0.3 && < 0.4,
     comonad              >= 3   && < 4,
     containers           >= 0.4 && < 0.6,
     hashable             >= 1.1 && < 1.3,
     lens                 >= 3.8 && < 4,
     profunctors          >= 3.2 && < 4,
+    safecopy             >= 0.6.3 && < 0.9,
     transformers         >= 0.2 && < 0.4,
     transformers-compat  >= 0.1 && < 1,
     unordered-containers == 0.2.*
