diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,21 @@
 Changelog
 =========
 
+Version 0.1.5.1
+---------------
+
+*Apr 8, 2018*
+
+<https://github.com/mstksg/backprop/releases/tag/v0.1.5.1>
+
+*   Fixed `NFData` instance for `T`; before, was shallow.
+*   Added `Typeable` instances for all tuple types, and for `BVar`.
+*   Added `Eq`, `Ord`, `Show`, etc. instances for `T`.
+*   Added `Binary` instances for all tuple types.  Note that this does incur a
+    *binary* dependency only because of the tuple types; however, this will
+    hopefully be not too much of an issue because *binary* is a GHC library
+    anyway.
+
 Version 0.1.5.0
 ---------------
 
diff --git a/backprop.cabal b/backprop.cabal
--- a/backprop.cabal
+++ b/backprop.cabal
@@ -1,11 +1,11 @@
--- This file has been generated from package.yaml by hpack version 0.20.0.
+-- This file has been generated from package.yaml by hpack version 0.21.2.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: f63250aadbaab3be65345eb28df24e2b368dc8f857f029577525ef698e71540c
+-- hash: 27ad120cc4fb815335e1be622df84ce63c95b38332af173a6898e59a80a7c0ad
 
 name:           backprop
-version:        0.1.5.0
+version:        0.1.5.1
 synopsis:       Heterogeneous automatic differentation (backpropagation)
 description:    Write your functions to compute your result, and the library will
                 automatically generate functions to compute your gradient.
@@ -47,6 +47,7 @@
   ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wredundant-constraints -fprint-explicit-kinds
   build-depends:
       base >=4.7 && <5
+    , binary
     , deepseq
     , microlens
     , primitive
diff --git a/src/Numeric/Backprop/Internal.hs b/src/Numeric/Backprop/Internal.hs
--- a/src/Numeric/Backprop/Internal.hs
+++ b/src/Numeric/Backprop/Internal.hs
@@ -1,10 +1,12 @@
 {-# LANGUAGE BangPatterns        #-}
+{-# LANGUAGE DeriveDataTypeable  #-}
 {-# LANGUAGE DeriveGeneric       #-}
 {-# LANGUAGE FlexibleContexts    #-}
 {-# LANGUAGE GADTs               #-}
 {-# LANGUAGE RankNTypes          #-}
 {-# LANGUAGE RecordWildCards     #-}
 {-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE StandaloneDeriving  #-}
 {-# LANGUAGE TupleSections       #-}
 {-# LANGUAGE TypeApplications    #-}
 {-# LANGUAGE TypeInType          #-}
@@ -53,6 +55,7 @@
 import           Data.Type.Product hiding  (toList)
 import           Data.Type.Util
 import           Data.Type.Vector hiding   (itraverse)
+import           Data.Typeable
 import           GHC.Exts                  (Any)
 import           GHC.Generics
 import           Lens.Micro
@@ -106,6 +109,9 @@
 data BVar s a = BV { _bvRef :: !(BRef s)
                    , _bvVal :: !a
                    }
+
+-- | @since 0.1.5.1
+deriving instance Typeable (BVar s a)
 
 data BRef (s :: Type) = BRInp !Int
                       | BRIx !Int
diff --git a/src/Numeric/Backprop/Tuple.hs b/src/Numeric/Backprop/Tuple.hs
--- a/src/Numeric/Backprop/Tuple.hs
+++ b/src/Numeric/Backprop/Tuple.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE AllowAmbiguousTypes   #-}
-{-# LANGUAGE BangPatterns          #-}
 {-# LANGUAGE CPP                   #-}
 {-# LANGUAGE ConstraintKinds       #-}
 {-# LANGUAGE DeriveDataTypeable    #-}
@@ -12,6 +11,7 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE RankNTypes            #-}
 {-# LANGUAGE ScopedTypeVariables   #-}
+{-# LANGUAGE StandaloneDeriving    #-}
 {-# LANGUAGE TypeApplications      #-}
 {-# LANGUAGE TypeInType            #-}
 {-# LANGUAGE TypeOperators         #-}
@@ -114,6 +114,7 @@
 import           Lens.Micro.Internal hiding (Index)
 import           Type.Class.Known
 import           Type.Family.List
+import qualified Data.Binary                as Bi
 
 #if !MIN_VERSION_base(4,11,0)
 import           Data.Semigroup
@@ -123,29 +124,27 @@
 --
 -- Be aware that the methods in its numerical instances are all non-strict:
 --
--- @@
+-- @
 -- _ + _ = 'T0'
 -- 'negate' _ = 'T0'
 -- 'fromIntegral' _ = 'T0'
--- @@
+-- @
 --
 -- @since 0.1.4.0
 data T0 = T0
   deriving (Show, Read, Eq, Ord, Generic, Data)
 
-instance NFData T0
-
 -- | Strict 2-tuple with 'Num', 'Fractional', and 'Floating' instances.
 --
 -- @since 0.1.1.0
 data T2 a b   = T2 !a !b
-  deriving (Show, Read, Eq, Ord, Generic, Functor, Data)
+  deriving (Show, Read, Eq, Ord, Generic, Functor, Data, Typeable)
 
 -- | Strict 3-tuple with a 'Num', 'Fractional', and 'Floating' instances.
 --
 -- @since 0.1.1.0
 data T3 a b c = T3 !a !b !c
-  deriving (Show, Read, Eq, Ord, Generic, Functor, Data)
+  deriving (Show, Read, Eq, Ord, Generic, Functor, Data, Typeable)
 
 -- | Strict inductive N-tuple with a 'Num', 'Fractional', and 'Floating'
 -- instances.
@@ -165,13 +164,39 @@
     TNil :: T '[]
     (:&) :: !a -> !(T as) -> T (a ': as)
 
+-- | @since 0.1.5.1
+deriving instance ListC (Show <$> as) => Show (T as)
+-- | @since 0.1.5.1
+deriving instance ListC (Eq <$> as) => Eq (T as)
+-- | @since 0.1.5.1
+deriving instance (ListC (Eq <$> as), ListC (Ord <$> as)) => Ord (T as)
+-- | @since 0.1.5.1
+deriving instance Typeable (T as)
+
+-- | @since 0.1.5.1
+deriving instance Typeable T0
+-- | @since 0.1.5.1
+deriving instance Typeable (T2 a b)
+-- | @since 0.1.5.1
+deriving instance Typeable (T3 a b c)
+
+instance NFData T0
 instance (NFData a, NFData b) => NFData (T2 a b)
 instance (NFData a, NFData b, NFData c) => NFData (T3 a b c)
 instance ListC (NFData <$> as) => NFData (T as) where
     rnf = \case
-      TNil       -> ()
-      (!_) :& xs -> rnf xs
+      TNil    -> ()
+      x :& xs -> rnf x `seq` rnf xs
 
+-- TODO: optimize
+
+-- | @since 0.1.5.1
+instance Bi.Binary T0
+-- | @since 0.1.5.1
+instance (Bi.Binary a, Bi.Binary b) => Bi.Binary (T2 a b)
+-- | @since 0.1.5.1
+instance (Bi.Binary a, Bi.Binary b, Bi.Binary c) => Bi.Binary (T3 a b c)
+
 instance Bifunctor T2 where
     bimap f g (T2 x y) = T2 (f x) (g y)
 
@@ -587,6 +612,23 @@
 instance (Known Length as, ListC (Semigroup <$> as), ListC (Monoid <$> as)) => Monoid (T as) where
     mempty  = constT @Monoid mempty known
     mappend = (<>)
+
+-- | @since 0.1.5.1
+instance (Known Length as, ListC (Bi.Binary <$> as)) => Bi.Binary (T as) where
+    put = \case
+      TNil -> pure ()
+      x :& xs -> do
+        Bi.put x
+        Bi.put xs
+    get = getT known
+
+getT :: ListC (Bi.Binary <$> as) => Length as -> Bi.Get (T as)
+getT = \case
+    LZ   -> pure TNil
+    LS l -> do
+      x  <- Bi.get
+      xs <- getT l
+      pure (x :& xs)
 
 -- $t2iso
 --
