diff --git a/grid.cabal b/grid.cabal
--- a/grid.cabal
+++ b/grid.cabal
@@ -1,5 +1,5 @@
 name:           grid
-version:        3.0.1
+version:        3.1
 synopsis:       Tools for working with regular grids (graphs, lattices).
 description:    Provides tools for working with regular arrangements
                 of tiles, such as might be used in a board game or some
@@ -26,7 +26,8 @@
   hs-source-dirs:  src
   build-depends:   base ==4.*,
                    base-unicode-symbols ==0.2.*,
-                   containers ==0.4.2.*
+                   cereal ==0.3.*,
+                   containers ==0.4.2.* || ==0.5.*
   ghc-options:     -Wall
   exposed-modules: Math.Geometry.Grid,
                    Math.Geometry.GridInternal,
@@ -36,9 +37,9 @@
   type:            exitcode-stdio-1.0
   build-depends:   base ==4.*,
                    exact-combinatorics ==0.2.*,
-                   test-framework-quickcheck2 == 0.3.*,
-                   QuickCheck == 2.4.*,
-                   test-framework == 0.*,
+                   test-framework-quickcheck2 ==0.3.*,
+                   QuickCheck ==2.4.* || ==2.5.*,
+                   test-framework ==0.8.*,
                    grid,
                    base-unicode-symbols ==0.2.*
   hs-source-dirs:  test
diff --git a/src/Math/Geometry/GridInternal.hs b/src/Math/Geometry/GridInternal.hs
--- a/src/Math/Geometry/GridInternal.hs
+++ b/src/Math/Geometry/GridInternal.hs
@@ -13,7 +13,7 @@
 ------------------------------------------------------------------------
 {-# LANGUAGE UnicodeSyntax, MultiParamTypeClasses, 
     FunctionalDependencies, TypeSynonymInstances, FlexibleInstances, 
-    FlexibleContexts #-}
+    FlexibleContexts, DeriveGeneric #-}
 
 module Math.Geometry.GridInternal
   (
@@ -42,6 +42,8 @@
 import Data.List (groupBy, nub, nubBy, sortBy)
 import Data.Ord (comparing)
 import Data.Ord.Unicode ((≤), (≥))
+import Data.Serialize (Serialize)
+import GHC.Generics (Generic)
 
 -- | A regular arrangement of tiles.
 --   Minimal complete definition: @indices@, @distance@ and @size@.
@@ -216,11 +218,13 @@
 -- | A triangular grid with triangular tiles.
 --   The grid and its indexing scheme are illustrated in the user guide,
 --   available at <https://github.com/mhwombat/grid/wiki>.
-data TriTriGrid = TriTriGrid Int [(Int, Int)] deriving Eq
+data TriTriGrid = TriTriGrid Int [(Int, Int)] deriving (Eq, Generic)
 
 instance Show TriTriGrid where 
   show (TriTriGrid s _) = "triTriGrid " ++ show s
 
+instance Serialize TriTriGrid
+
 instance Grid TriTriGrid Int (Int, Int) where
   indices (TriTriGrid _ xs) = xs
   neighbours = triNeighbours
@@ -269,11 +273,13 @@
 -- | A Parallelogrammatical grid with triangular tiles.
 --   The grid and its indexing scheme are illustrated in the user guide,
 --   available at <https://github.com/mhwombat/grid/wiki>.
-data ParaTriGrid = ParaTriGrid (Int, Int) [(Int, Int)] deriving Eq
+data ParaTriGrid = ParaTriGrid (Int, Int) [(Int, Int)] deriving (Eq, Generic)
 
 instance Show ParaTriGrid where 
   show (ParaTriGrid (r,c) _) = "paraTriGrid " ++ show r ++ " " ++ show c
 
+instance Serialize ParaTriGrid
+
 instance Grid ParaTriGrid (Int, Int) (Int, Int) where
   indices (ParaTriGrid _ xs) = xs
   neighbours = triNeighbours
@@ -318,12 +324,14 @@
 -- | A rectangular grid with square tiles.
 --   The grid and its indexing scheme are illustrated in the user guide,
 --   available at <https://github.com/mhwombat/grid/wiki>.
-data RectSquareGrid = RectSquareGrid (Int, Int) [(Int, Int)] deriving Eq
+data RectSquareGrid = RectSquareGrid (Int, Int) [(Int, Int)] deriving (Eq, Generic)
 
 instance Show RectSquareGrid where 
   show (RectSquareGrid (r,c) _) = 
     "rectSquareGrid " ++ show r ++ " " ++ show c
 
+instance Serialize RectSquareGrid
+
 instance Grid RectSquareGrid (Int, Int) (Int, Int) where
   indices (RectSquareGrid _ xs) = xs
   neighbours g (x, y) = 
@@ -375,11 +383,13 @@
 -- | A toroidal grid with square tiles.
 --   The grid and its indexing scheme are illustrated in the user guide,
 --   available at <https://github.com/mhwombat/grid/wiki>.
-data TorSquareGrid = TorSquareGrid (Int, Int) [(Int, Int)] deriving Eq
+data TorSquareGrid = TorSquareGrid (Int, Int) [(Int, Int)] deriving (Eq, Generic)
 
 instance Show TorSquareGrid where 
   show (TorSquareGrid (r,c) _) = "torSquareGrid " ++ show r ++ " " ++ show c
 
+instance Serialize TorSquareGrid
+
 instance Grid TorSquareGrid (Int, Int) (Int, Int) where
   indices (TorSquareGrid _ xs) = xs
   neighbours (TorSquareGrid (r,c) _) (x,y) = 
@@ -420,10 +430,12 @@
 -- | A hexagonal grid with hexagonal tiles
 --   The grid and its indexing scheme are illustrated in the user guide,
 --   available at <https://github.com/mhwombat/grid/wiki>.
-data HexHexGrid = HexHexGrid Int [(Int, Int)] deriving Eq
+data HexHexGrid = HexHexGrid Int [(Int, Int)] deriving (Eq, Generic)
 
 instance Show HexHexGrid where show (HexHexGrid s _) = "hexHexGrid " ++ show s
 
+instance Serialize HexHexGrid
+
 instance Grid HexHexGrid Int (Int, Int) where
   indices (HexHexGrid _ xs) = xs
   neighbours g (x,y) = filter (g `contains`) 
@@ -458,10 +470,12 @@
 -- | A parallelogramatical grid with hexagonal tiles
 --   The grid and its indexing scheme are illustrated in the user guide,
 --   available at <https://github.com/mhwombat/grid/wiki>.
-data ParaHexGrid = ParaHexGrid (Int, Int) [(Int, Int)] deriving Eq
+data ParaHexGrid = ParaHexGrid (Int, Int) [(Int, Int)] deriving (Eq, Generic)
 
 instance Show ParaHexGrid where 
   show (ParaHexGrid (r,c) _) = "paraHexGrid " ++ show r ++ " " ++ show c
+
+instance Serialize ParaHexGrid
 
 instance Grid ParaHexGrid (Int, Int) (Int, Int) where
   indices (ParaHexGrid _ xs) = xs
