diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,7 @@
+0.8
+---
+* Added `Serial`, `Binary` and `Serialize` instances for `Scope`.
+
 0.7
 ---
 * Added `Hashable`, `Hashable1` and `Hashable2` instances where appropriate for `Name`, `Var` and `Scope`.
diff --git a/bound.cabal b/bound.cabal
--- a/bound.cabal
+++ b/bound.cabal
@@ -1,6 +1,6 @@
 name:          bound
 category:      Language, Compilers/Interpreters
-version:       0.7
+version:       0.8
 license:       BSD3
 cabal-version: >= 1.9.2
 license-file:  LICENSE
@@ -63,14 +63,17 @@
     Bound.Var
 
   build-depends:
-    base            >= 4   && < 5,
-    bifunctors      >= 3   && < 4,
-    comonad         >= 3   && < 4,
-    hashable        >= 1.1 && < 1.3,
-    hashable-extras >= 0.1 && < 1,
-    prelude-extras  >= 0.3 && < 1,
-    profunctors     >= 3.3 && < 4,
-    transformers    >= 0.2 && < 0.4
+    base            >= 4       && < 5,
+    bifunctors      >= 3       && < 4,
+    binary          >= 0.5     && < 0.8,
+    bytes           >= 0.4     && < 1,
+    cereal          >= 0.3.5.2 && < 0.4,
+    comonad         >= 3       && < 4,
+    hashable        >= 1.1     && < 1.3,
+    hashable-extras >= 0.1     && < 1,
+    prelude-extras  >= 0.3     && < 1,
+    profunctors     >= 3.3     && < 4,
+    transformers    >= 0.2     && < 0.4
 
   ghc-options: -Wall -O2 -fspec-constr -fdicts-cheap -funbox-strict-fields
   if impl(ghc>=7.4)
diff --git a/examples/Simple.hs b/examples/Simple.hs
--- a/examples/Simple.hs
+++ b/examples/Simple.hs
@@ -1,7 +1,7 @@
 module Main where
 
 -- this is a simple example where lambdas only bind a single variable at a time
--- this directly corre:sponds to the usual de bruijn presentation
+-- this directly corresponds to the usual de bruijn presentation
 
 import Data.List (elemIndex)
 import Data.Foldable hiding (notElem)
diff --git a/src/Bound/Name.hs b/src/Bound/Name.hs
--- a/src/Bound/Name.hs
+++ b/src/Bound/Name.hs
@@ -42,13 +42,16 @@
 import Bound.Var
 import Control.Applicative
 import Control.Comonad
-import Control.Monad (liftM)
+import Control.Monad (liftM, liftM2)
 import Data.Foldable
 import Data.Traversable
 import Data.Monoid
 import Data.Bifunctor
 import Data.Bifoldable
+import qualified Data.Binary as Binary
+import Data.Binary (Binary)
 import Data.Bitraversable
+import Data.Bytes.Serial
 #ifdef __GLASGOW_HASKELL__
 import Data.Data
 # if __GLASGOW_HASKELL__ >= 704
@@ -58,6 +61,8 @@
 import Data.Hashable
 import Data.Hashable.Extras
 import Data.Profunctor
+import qualified Data.Serialize as Serialize
+import Data.Serialize (Serialize)
 import Prelude.Extras
 
 -------------------------------------------------------------------------------
@@ -169,6 +174,33 @@
   {-# INLINE compare2 #-}
 instance Show2 Name where showsPrec2 = showsPrec
 instance Read2 Name where readsPrec2  = readsPrec
+
+instance Serial2 Name where
+  serializeWith2 pb pf (Name b a) = pb b >> pf a
+  {-# INLINE serializeWith2 #-}
+
+  deserializeWith2 gb gf = liftM2 Name gb gf
+  {-# INLINE deserializeWith2 #-}
+
+instance Serial b => Serial1 (Name b) where
+  serializeWith = serializeWith2 serialize
+  {-# INLINE serializeWith #-}
+  deserializeWith = deserializeWith2 deserialize
+  {-# INLINE deserializeWith #-}
+
+instance (Serial b, Serial a) => Serial (Name b a) where
+  serialize = serializeWith2 serialize serialize
+  {-# INLINE serialize #-}
+  deserialize = deserializeWith2 deserialize deserialize
+  {-# INLINE deserialize #-}
+
+instance (Binary b, Binary a) => Binary (Name b a) where
+  put = serializeWith2 Binary.put Binary.put
+  get = deserializeWith2 Binary.get Binary.get
+
+instance (Serialize b, Serialize a) => Serialize (Name b a) where
+  put = serializeWith2 Serialize.put Serialize.put
+  get = deserializeWith2 Serialize.get Serialize.get
 
 -------------------------------------------------------------------------------
 -- Abstraction
diff --git a/src/Bound/Scope.hs b/src/Bound/Scope.hs
--- a/src/Bound/Scope.hs
+++ b/src/Bound/Scope.hs
@@ -39,6 +39,8 @@
   , traverseScope
   , mapMBound
   , mapMScope
+  , serializeScope
+  , deserializeScope
   ) where
 
 import Bound.Class
@@ -48,11 +50,18 @@
 import Control.Monad.Trans.Class
 import Data.Bifunctor
 import Data.Bifoldable
+import qualified Data.Binary as Binary
+import Data.Binary (Binary)
 import Data.Bitraversable
+import Data.Bytes.Get
+import Data.Bytes.Put
+import Data.Bytes.Serial
 import Data.Foldable
 import Data.Hashable
 import Data.Hashable.Extras
 import Data.Monoid
+import qualified Data.Serialize as Serialize
+import Data.Serialize (Serialize)
 import Data.Traversable
 import Prelude.Extras
 import Prelude hiding (foldr, mapM, mapM_)
@@ -347,3 +356,26 @@
 mapMScope f g (Scope s) = liftM Scope (mapM (bimapM f (mapM g)) s)
 {-# INLINE mapMScope #-}
 
+serializeScope :: (Serial1 f, MonadPut m) => (b -> m ()) -> (v -> m ()) -> Scope b f v -> m ()
+serializeScope pb pv (Scope body) = serializeWith (serializeWith2 pb $ serializeWith pv) body
+{-# INLINE serializeScope #-}
+
+deserializeScope :: (Serial1 f, MonadGet m) => m b -> m v -> m (Scope b f v)
+deserializeScope gb gv = liftM Scope $ deserializeWith (deserializeWith2 gb $ deserializeWith gv)
+{-# INLINE deserializeScope #-}
+
+instance (Serial b, Serial1 f) => Serial1 (Scope b f) where
+  serializeWith = serializeScope serialize
+  deserializeWith = deserializeScope deserialize
+
+instance (Serial b, Serial1 f, Serial a) => Serial (Scope b f a) where
+  serialize = serializeScope serialize serialize
+  deserialize = deserializeScope deserialize deserialize
+
+instance (Binary b, Serial1 f, Binary a) => Binary (Scope b f a) where
+  put = serializeScope Binary.put Binary.put
+  get = deserializeScope Binary.get Binary.get
+
+instance (Serialize b, Serial1 f, Serialize a) => Serialize (Scope b f a) where
+  put = serializeScope Serialize.put Serialize.put
+  get = deserializeScope Serialize.get Serialize.get
diff --git a/src/Bound/Var.hs b/src/Bound/Var.hs
--- a/src/Bound/Var.hs
+++ b/src/Bound/Var.hs
@@ -25,7 +25,7 @@
   ) where
 
 import Control.Applicative
-import Control.Monad (ap)
+import Control.Monad (liftM, ap)
 import Data.Foldable
 import Data.Traversable
 import Data.Monoid (mempty)
@@ -33,7 +33,12 @@
 import Data.Hashable.Extras
 import Data.Bifunctor
 import Data.Bifoldable
+import qualified Data.Binary as Binary
+import Data.Binary (Binary)
 import Data.Bitraversable
+import Data.Bytes.Get
+import Data.Bytes.Put
+import Data.Bytes.Serial
 #ifdef __GLASGOW_HASKELL__
 import Data.Data
 # if __GLASGOW_HASKELL__ >= 704
@@ -41,6 +46,8 @@
 # endif
 #endif
 import Data.Profunctor
+import qualified Data.Serialize as Serialize
+import Data.Serialize (Serialize)
 import Data.Word
 import Prelude.Extras
 
@@ -80,6 +87,37 @@
   hashWithSalt s (B b) = hashWithSalt s b
   hashWithSalt s (F a) = hashWithSalt s a `hashWithSalt` distinguisher
   {-# INLINE hashWithSalt #-}
+
+instance Serial2 Var where
+  serializeWith2 pb _  (B b) = putWord8 0 >> pb b
+  serializeWith2 _  pf (F f) = putWord8 1 >> pf f
+  {-# INLINE serializeWith2 #-}
+
+  deserializeWith2 gb gf = getWord8 >>= \b -> case b of
+    0 -> liftM B gb
+    1 -> liftM F gf
+    _ -> fail $ "getVar: Unexpected constructor code: " ++ show b
+  {-# INLINE deserializeWith2 #-}
+
+instance Serial b => Serial1 (Var b) where
+  serializeWith = serializeWith2 serialize
+  {-# INLINE serializeWith #-}
+  deserializeWith = deserializeWith2 deserialize
+  {-# INLINE deserializeWith #-}
+
+instance (Serial b, Serial a) => Serial (Var b a) where
+  serialize = serializeWith2 serialize serialize
+  {-# INLINE serialize #-}
+  deserialize = deserializeWith2 deserialize deserialize
+  {-# INLINE deserialize #-}
+
+instance (Binary b, Binary a) => Binary (Var b a) where
+  put = serializeWith2 Binary.put Binary.put
+  get = deserializeWith2 Binary.get Binary.get
+
+instance (Serialize b, Serialize a) => Serialize (Var b a) where
+  put = serializeWith2 Serialize.put Serialize.put
+  get = deserializeWith2 Serialize.get Serialize.get
 
 unvar :: (b -> r) -> (a -> r) -> Var b a -> r
 unvar f _ (B b) = f b
