diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,7 @@
+2022-01-07
+        * Version bump (3.7). (#287)
+        * Add example with nested structs. (#275)
+
 2021-11-07
         * Version bump (3.6). (#264)
         * Fix missing dependency in example executable. (#252)
diff --git a/copilot.cabal b/copilot.cabal
--- a/copilot.cabal
+++ b/copilot.cabal
@@ -1,5 +1,5 @@
 name:                copilot
-version:             3.6
+version:             3.7
 cabal-version:       >= 1.10
 license:             BSD3
 license-file:        LICENSE
@@ -50,11 +50,11 @@
                      , directory            >= 1.3  && < 1.4
                      , filepath             >= 1.4  && < 1.5
 
-                     , copilot-core         >= 3.6  && < 3.7
-                     , copilot-theorem      >= 3.6  && < 3.7
-                     , copilot-language     >= 3.6  && < 3.7
-                     , copilot-libraries    >= 3.6  && < 3.7
-                     , copilot-c99          >= 3.6  && < 3.7
+                     , copilot-core         >= 3.7  && < 3.8
+                     , copilot-theorem      >= 3.7  && < 3.8
+                     , copilot-language     >= 3.7  && < 3.8
+                     , copilot-libraries    >= 3.7  && < 3.8
+                     , copilot-c99          >= 3.7  && < 3.8
 
 
     exposed-modules: Language.Copilot, Language.Copilot.Main
@@ -182,6 +182,18 @@
 
 executable heater
     main-is:            Heater.hs
+    hs-source-dirs:     examples
+    build-depends:      base              >= 4.9  && < 5
+                      , copilot
+                      , copilot-c99
+    default-language:   Haskell2010
+    if flag(examples)
+      buildable: True
+    else
+      buildable: False
+
+executable structs
+    main-is:            Structs.hs
     hs-source-dirs:     examples
     build-depends:      base              >= 4.9  && < 5
                       , copilot
diff --git a/examples/Structs.hs b/examples/Structs.hs
new file mode 100644
--- /dev/null
+++ b/examples/Structs.hs
@@ -0,0 +1,75 @@
+-- | An example showing how specifications involving structs (in particular,
+-- nested structs) are compiled to C using copilot-c99.
+
+{-# LANGUAGE DataKinds #-}
+
+module Main where
+
+import qualified Prelude as P
+import Control.Monad (void, forM_)
+
+import Language.Copilot
+import Copilot.Compile.C99
+
+
+-- | Definition for `Volts`.
+data Volts = Volts
+  { numVolts :: Field "numVolts" Word16
+  , flag     :: Field "flag"     Bool
+  }
+
+-- | `Struct` instance for `Volts`.
+instance Struct Volts where
+  typename _ = "volts"
+  toValues volts = [ Value Word16 (numVolts volts)
+                   , Value Bool   (flag volts)
+                   ]
+
+-- | `Volts` instance for `Typed`.
+instance Typed Volts where
+  typeOf = Struct (Volts (Field 0) (Field False))
+
+data Battery = Battery
+  { temp  :: Field "temp"  Word16
+  , volts :: Field "volts" (Array 10 Volts)
+  , other :: Field "other" (Array 10 (Array 5 Word32))
+  }
+
+-- | `Battery` instance for `Struct`.
+instance Struct Battery where
+  typename _ = "battery"
+  toValues battery = [ Value typeOf (temp battery)
+                     , Value typeOf (volts battery)
+                     , Value typeOf (other battery)
+                     ]
+
+-- | `Battery` instance for `Typed`. Note that `undefined` is used as an
+-- argument to `Field`. This argument is never used, so `undefined` will never
+-- throw an error.
+instance Typed Battery where
+  typeOf = Struct (Battery (Field 0) (Field undefined) (Field undefined))
+
+spec :: Spec
+spec = do
+  let battery :: Stream Battery
+      battery = extern "battery" Nothing
+
+  -- Check equality, indexing into nested structs and arrays. Note that this is
+  -- trivial by equality.
+  trigger "equalitySameIndex"
+    ((((battery#volts) .!! 0)#numVolts) == (((battery#volts) .!! 0)#numVolts))
+    [arg battery]
+
+  -- Same as previous example, but get a different array index (so should be
+  -- false).
+  trigger "equalityDifferentIndices"
+    ((((battery#other) .!! 2) .!! 3) == (((battery#other) .!! 2) .!! 4))
+    [arg battery]
+
+
+main :: IO ()
+main = do
+  spec' <- reify spec
+
+  -- Compile the specific to C.
+  compile "structs" spec'
