diff --git a/linear.cabal b/linear.cabal
--- a/linear.cabal
+++ b/linear.cabal
@@ -1,6 +1,6 @@
 name:          linear
 category:      Math, Algebra
-version:       1.16.4
+version:       1.17
 license:       BSD3
 cabal-version: >= 1.8
 license-file:  LICENSE
@@ -33,6 +33,8 @@
     adjunctions          >= 4     && < 5,
     base                 >= 4.5   && < 5,
     binary               >= 0.5   && < 0.8,
+    bytes                >= 0.15  && < 1,
+    cereal               >= 0.4.1.1 && < 0.5,
     containers           >= 0.4   && < 0.6,
     deepseq              >= 1.1   && < 1.5,
     distributive         >= 0.2.2 && < 1,
diff --git a/src/Linear/Plucker.hs b/src/Linear/Plucker.hs
--- a/src/Linear/Plucker.hs
+++ b/src/Linear/Plucker.hs
@@ -51,6 +51,8 @@
 import Control.Monad.Fix
 import Control.Monad.Zip
 import Control.Lens hiding (index, (<.>))
+import Data.Binary as Binary
+import Data.Bytes.Serial
 import Data.Distributive
 import Data.Foldable as Foldable
 import Data.Functor.Bind
@@ -58,6 +60,7 @@
 import Data.Hashable
 import Data.Semigroup
 import Data.Semigroup.Foldable
+import Data.Serialize as Cereal
 import Foreign.Ptr (castPtr)
 import Foreign.Storable (Storable(..))
 import GHC.Arr (Ix(..))
@@ -562,3 +565,14 @@
 instance NFData a => NFData (Plucker a) where
   rnf (Plucker a b c d e f) = rnf a `seq` rnf b `seq` rnf c
                         `seq` rnf d `seq` rnf e `seq` rnf f
+
+instance Serial1 Plucker
+instance Serial a => Serial (Plucker a)
+
+instance Binary a => Binary (Plucker a) where
+  put = serializeWith Binary.put
+  get = deserializeWith Binary.get
+
+instance Serialize a => Serialize (Plucker a) where
+  put = serializeWith Cereal.put
+  get = deserializeWith Cereal.get
diff --git a/src/Linear/Quaternion.hs b/src/Linear/Quaternion.hs
--- a/src/Linear/Quaternion.hs
+++ b/src/Linear/Quaternion.hs
@@ -44,6 +44,9 @@
 import Control.Monad.Fix
 import Control.Monad.Zip
 import Control.Lens hiding ((<.>))
+import Data.Binary as Binary
+import Data.Bytes.Serial
+
 import Data.Complex (Complex((:+)))
 import Data.Data
 import Data.Distributive
@@ -51,6 +54,7 @@
 import Data.Functor.Bind
 import Data.Functor.Rep
 import Data.Hashable
+import Data.Serialize as Cereal
 import GHC.Arr (Ix(..))
 import qualified Data.Foldable as F
 import Data.Monoid
@@ -554,3 +558,14 @@
 
 instance NFData a => NFData (Quaternion a) where
   rnf (Quaternion a b) = rnf a `seq` rnf b
+
+instance Serial1 Quaternion
+instance Serial a => Serial (Quaternion a)
+
+instance Binary a => Binary (Quaternion a) where
+  put = serializeWith Binary.put
+  get = deserializeWith Binary.get
+
+instance Serialize a => Serialize (Quaternion a) where
+  put = serializeWith Cereal.put
+  get = deserializeWith Cereal.get
diff --git a/src/Linear/V.hs b/src/Linear/V.hs
--- a/src/Linear/V.hs
+++ b/src/Linear/V.hs
@@ -47,6 +47,8 @@
 import Control.Monad.Fix
 import Control.Monad.Zip
 import Control.Lens as Lens
+import Data.Binary as Binary
+import Data.Bytes.Serial
 import Data.Data
 import Data.Distributive
 import Data.Foldable as Foldable
@@ -56,6 +58,8 @@
 import Data.Proxy
 #endif
 import Data.Reflection as R
+import Data.Serialize as Cereal
+import Data.Traversable (sequenceA)
 import Data.Vector as V
 import Foreign.Ptr
 import Foreign.Storable
@@ -372,3 +376,18 @@
   dataTypeOf _ = vDataType
   dataCast1 f = gcast1 f
 
+instance Dim n => Serial1 (V n) where
+  serializeWith = traverse_
+  deserializeWith f = sequenceA $ pure f
+
+instance (Dim n, Serial a) => Serial (V n a) where
+  serialize = traverse_ serialize
+  deserialize = sequenceA $ pure deserialize
+
+instance (Dim n, Binary a) => Binary (V n a) where
+  put = serializeWith Binary.put
+  get = deserializeWith Binary.get
+
+instance (Dim n, Serialize a) => Serialize (V n a) where
+  put = serializeWith Cereal.put
+  get = deserializeWith Cereal.get
diff --git a/src/Linear/V0.hs b/src/Linear/V0.hs
--- a/src/Linear/V0.hs
+++ b/src/Linear/V0.hs
@@ -32,6 +32,8 @@
 import Control.Lens
 import Control.Monad.Fix
 import Control.Monad.Zip
+import Data.Binary -- binary
+import Data.Bytes.Serial -- bytes
 import Data.Data
 import Data.Distributive
 import Data.Foldable
@@ -40,6 +42,7 @@
 import Data.Hashable
 import Data.Ix
 import Data.Semigroup
+import Data.Serialize -- cereal
 import Foreign.Storable (Storable(..))
 #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702
 import GHC.Generics (Generic)
@@ -74,6 +77,17 @@
                         ,Generic1
 #endif
                         )
+
+instance Serial1 V0
+instance Serial (V0 a)
+
+instance Binary (V0 a) where
+  put V0 = return ()
+  get = return V0
+
+instance Serialize (V0 a) where
+  put V0 = return ()
+  get = return V0
 
 instance Functor V0 where
   fmap _ V0 = V0
diff --git a/src/Linear/V1.hs b/src/Linear/V1.hs
--- a/src/Linear/V1.hs
+++ b/src/Linear/V1.hs
@@ -40,6 +40,9 @@
 import Control.Monad.Fix
 import Control.Monad.Zip
 import Control.Lens
+import Data.Binary as Binary
+import Data.Bytes.Serial
+import Data.Serialize as Cereal
 import Data.Data
 import Data.Distributive
 import Data.Foldable
@@ -308,3 +311,15 @@
   {-# INLINE minBound #-}
   maxBound = pure maxBound
   {-# INLINE maxBound #-}
+
+instance Serial1 V1
+instance Serial a => Serial (V1 a)
+
+instance Binary a => Binary (V1 a) where
+  put = serializeWith Binary.put
+  get = deserializeWith Binary.get
+
+instance Serialize a => Serialize (V1 a) where
+  put = serializeWith Cereal.put
+  get = deserializeWith Cereal.get
+
diff --git a/src/Linear/V2.hs b/src/Linear/V2.hs
--- a/src/Linear/V2.hs
+++ b/src/Linear/V2.hs
@@ -37,6 +37,8 @@
 import Control.Monad.Fix
 import Control.Monad.Zip
 import Control.Lens hiding ((<.>))
+import Data.Binary as Binary
+import Data.Bytes.Serial
 import Data.Data
 import Data.Distributive
 import Data.Foldable
@@ -45,6 +47,7 @@
 import Data.Functor.Rep
 import Data.Semigroup
 import Data.Semigroup.Foldable
+import Data.Serialize as Cereal
 import Foreign.Ptr (castPtr)
 import Foreign.Storable (Storable(..))
 import GHC.Arr (Ix(..))
@@ -370,3 +373,14 @@
 
 instance NFData a => NFData (V2 a) where
   rnf (V2 a b) = rnf a `seq` rnf b
+
+instance Serial1 V2
+instance Serial a => Serial (V2 a)
+
+instance Binary a => Binary (V2 a) where
+  put = serializeWith Binary.put
+  get = deserializeWith Binary.get
+
+instance Serialize a => Serialize (V2 a) where
+  put = serializeWith Cereal.put
+  get = deserializeWith Cereal.get
diff --git a/src/Linear/V3.hs b/src/Linear/V3.hs
--- a/src/Linear/V3.hs
+++ b/src/Linear/V3.hs
@@ -38,6 +38,8 @@
 import Control.Monad.Fix
 import Control.Monad.Zip
 import Control.Lens hiding ((<.>))
+import Data.Binary as Binary -- binary
+import Data.Bytes.Serial -- bytes
 import Data.Data
 import Data.Distributive
 import Data.Foldable
@@ -46,6 +48,7 @@
 import Data.Hashable
 import Data.Semigroup
 import Data.Semigroup.Foldable
+import Data.Serialize as Cereal -- cereal
 import Foreign.Ptr (castPtr)
 import Foreign.Storable (Storable(..))
 import GHC.Arr (Ix(..))
@@ -393,3 +396,14 @@
 
 instance NFData a => NFData (V3 a) where
   rnf (V3 a b c) = rnf a `seq` rnf b `seq` rnf c
+
+instance Serial1 V3
+instance Serial a => Serial (V3 a)
+
+instance Binary a => Binary (V3 a) where
+  put = serializeWith Binary.put
+  get = deserializeWith Binary.get
+
+instance Serialize a => Serialize (V3 a) where
+  put = serializeWith Cereal.put
+  get = deserializeWith Cereal.get
diff --git a/src/Linear/V4.hs b/src/Linear/V4.hs
--- a/src/Linear/V4.hs
+++ b/src/Linear/V4.hs
@@ -45,6 +45,8 @@
 import Control.Monad.Fix
 import Control.Monad.Zip
 import Control.Lens hiding ((<.>))
+import Data.Binary as Binary
+import Data.Bytes.Serial
 import Data.Data
 import Data.Distributive
 import Data.Foldable
@@ -53,6 +55,7 @@
 import Data.Hashable
 import Data.Semigroup
 import Data.Semigroup.Foldable
+import Data.Serialize as Cereal
 import Foreign.Ptr (castPtr)
 import Foreign.Storable (Storable(..))
 import GHC.Arr (Ix(..))
@@ -540,3 +543,14 @@
 
 instance NFData a => NFData (V4 a) where
   rnf (V4 a b c d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d
+
+instance Serial1 V4
+instance Serial a => Serial (V4 a)
+
+instance Binary a => Binary (V4 a) where
+  put = serializeWith Binary.put
+  get = deserializeWith Binary.get
+
+instance Serialize a => Serialize (V4 a) where
+  put = serializeWith Cereal.put
+  get = deserializeWith Cereal.get
