diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.2.2.0
+
+* Add 'Data.Default' instance
+
 # 0.2.1.0
 
 * Add 'Gettable', 'Settable', 'Modifiable' type synonyms.
diff --git a/bench/Main.hs b/bench/Main.hs
new file mode 100644
--- /dev/null
+++ b/bench/Main.hs
@@ -0,0 +1,36 @@
+module Main where
+
+import Bookkeeper
+import Criterion.Main
+
+type PersonB = Book '[ "name" :=> String, "age" :=> Int ]
+data PersonR = PersonR { name ::  String, age :: {-# NOUNPACK #-} Int } deriving (Eq, Show)
+
+pb :: PersonB
+pb = emptyBook
+   & #name =: ""
+   & #age =: 0
+
+pr :: PersonR
+pr = PersonR
+   { name = ""
+   , age = 0
+   }
+
+modB :: Int -> PersonB
+modB 0 = pb
+modB n = modB (n - 1) & #age %: (+ n)
+
+modR :: Int -> PersonR
+modR 0 = pr
+modR n = let p = modR (n - 1) in p { age = age p + n }
+
+main :: IO ()
+main = defaultMain
+  [ bgroup "modB" [ bench "10" $ nf (\x -> get #age $ modB x) 10
+                  , bench "100" $ nf (\x -> get #age $ modB x) 100
+                  ]
+  , bgroup "modR" [ bench "10" $ nf (\x -> age $ modR x) 10
+                  , bench "100" $ nf (\x -> age $ modR x) 100
+                  ]
+  ]
diff --git a/bookkeeper.cabal b/bookkeeper.cabal
--- a/bookkeeper.cabal
+++ b/bookkeeper.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           bookkeeper
-version:        0.2.1.1
+version:        0.2.2.0
 synopsis:       Anonymous records and overloaded labels
 description:    Please see README.md
 category:       Data Structures, Records
@@ -34,6 +34,7 @@
   build-depends:
       base >= 4.9 && < 4.10
     , type-level-sets
+    , data-default-class
   exposed-modules:
       Bookkeeper
       Bookkeeper.Internal
@@ -48,6 +49,7 @@
   build-depends:
       base >= 4.9 && < 4.10
     , type-level-sets
+    , data-default-class
     , base >=4.9 && < 4.10 , bookkeeper , markdown-unlit
   default-language: Haskell2010
 
@@ -61,6 +63,7 @@
   build-depends:
       base >= 4.9 && < 4.10
     , type-level-sets
+    , data-default-class
     , doctest >= 0.9 && < 0.12
     , Glob >= 0.7 && < 0.8
     , yaml == 0.8.*
@@ -79,10 +82,26 @@
   build-depends:
       base >= 4.9 && < 4.10
     , type-level-sets
+    , data-default-class
     , bookkeeper
     , hspec > 2 && < 3
     , QuickCheck >= 2.8 && < 2.9
   other-modules:
       BookkeeperSpec
       Doctest
+  default-language: Haskell2010
+
+benchmark bench
+  type: exitcode-stdio-1.0
+  main-is: Main.hs
+  hs-source-dirs:
+      bench
+  default-extensions: AutoDeriveTypeable ConstraintKinds DataKinds DefaultSignatures DeriveFunctor DeriveGeneric DeriveFoldable DeriveTraversable FlexibleContexts FlexibleInstances FunctionalDependencies GADTs MultiParamTypeClasses KindSignatures TypeInType OverloadedStrings RankNTypes ScopedTypeVariables TypeApplications TypeFamilies TypeOperators OverloadedLabels MagicHash
+  ghc-options: -Wall -O2
+  build-depends:
+      base >= 4.9 && < 4.10
+    , type-level-sets
+    , data-default-class
+    , bookkeeper
+    , criterion
   default-language: Haskell2010
diff --git a/src/Bookkeeper/Internal.hs b/src/Bookkeeper/Internal.hs
--- a/src/Bookkeeper/Internal.hs
+++ b/src/Bookkeeper/Internal.hs
@@ -6,6 +6,7 @@
 import GHC.Generics (Generic)
 import qualified Data.Type.Map as Map
 import GHC.TypeLits (Symbol, KnownSymbol)
+import Data.Default.Class (Default(..))
 import Data.Kind (Type)
 import Data.Type.Map (Map, Mapping((:->)))
 import Data.Monoid ((<>))
@@ -50,6 +51,14 @@
 instance Monoid (Book' '[]) where
   mempty = emptyBook
   _ `mappend` _ = emptyBook
+
+instance Default (Book' '[]) where
+  def = emptyBook
+
+instance ( Default (Book' xs)
+         , Default v
+         ) => Default (Book' ((k :=> v) ': xs)) where
+  def = Book (Map.Ext Map.Var def (getBook def))
 
 -- | A book with no records. You'll usually want to use this to construct
 -- books.
diff --git a/test/BookkeeperSpec.hs b/test/BookkeeperSpec.hs
--- a/test/BookkeeperSpec.hs
+++ b/test/BookkeeperSpec.hs
@@ -31,6 +31,10 @@
              = p & #name %: fmap toUpper
       get #name p' `shouldBe` "JULIAN K. ARNI"
 
+    it "allows type-chaging update" $ do
+      let p' = p & #name %: length
+      get #name p' `shouldBe` 14
+
     it "allows extension" $ do
       let p' = #email =: "jkarni<at>turingjump<dot>com" $ p
       get #email p' `shouldBe` ("jkarni<at>turingjump<dot>com" :: String)
