diff --git a/Ledger/Balance.hs b/Ledger/Balance.hs
--- a/Ledger/Balance.hs
+++ b/Ledger/Balance.hs
@@ -5,6 +5,7 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PackageImports #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE TypeFamilies #-}
@@ -22,7 +23,7 @@
     ) where
 
 import           Control.Applicative
-import           Control.Comonad.Trans.Store
+import "comonad" Control.Comonad.Trans.Store
 import           Control.Lens hiding (from, to)
 import qualified Control.Lens.Internal as Lens
 import           Control.Monad hiding (forM)
diff --git a/Ledger/Commodity/Parse.hs b/Ledger/Commodity/Parse.hs
--- a/Ledger/Commodity/Parse.hs
+++ b/Ledger/Commodity/Parse.hs
@@ -1,9 +1,12 @@
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE PackageImports #-}
+
 module Ledger.Commodity.Parse where
 
-import Control.Monad.Trans.State
-import Data.Text
-import Ledger.Balance
-import Ledger.Commodity
+import "mtl" Control.Monad.State.Class
+import       Data.Text.Lazy
+import       Ledger.Balance
+import       Ledger.Commodity
 
-parseAmount :: Text -> State CommodityMap (Balance a)
-parseAmount _str = undefined
+parseBalance :: MonadState CommodityMap m => Text -> m (Balance a)
+parseBalance _str = undefined
diff --git a/Ledger/Commodity/Print.hs b/Ledger/Commodity/Print.hs
--- a/Ledger/Commodity/Print.hs
+++ b/Ledger/Commodity/Print.hs
@@ -1,38 +1,50 @@
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE ImpredicativeTypes #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE PackageImports #-}
 
-module Ledger.Commodity.Print where
+module Ledger.Commodity.Print
+    ( printBalance
+    , balance
+    ) where
 
 import           Control.Applicative
 import           Control.Lens
-import           Control.Monad.Reader.Class
+import "mtl"     Control.Monad.Reader.Class
+import           Control.Monad.Trans.Reader (runReader)
+import           Control.Monad.Trans.State (evalState)
 import           Control.Monad.Trans.Writer
 import qualified Data.IntMap.Strict as IntMap
+import           Data.Maybe (fromMaybe)
 import           Data.Text.Lazy
 import           Data.Text.Lazy.Builder
 import           Ledger.Balance
 import           Ledger.Commodity
+import           Ledger.Commodity.Parse
 
-printAmount :: (MonadReader CommodityMap m, Functor m, Show a)
-            => Balance a
-            -> m Text
-printAmount Zero = return "0"
-printAmount (Plain x) = return $ pack (show x)
-printAmount x = toLazyText <$> execWriterT (buildAmount x)
+printBalance :: (MonadReader CommodityMap m, Functor m, Show a)
+             => Balance a
+             -> m Text
+printBalance Zero = return "0"
+printBalance (Plain x) = return $ pack (show x)
+printBalance x = toLazyText <$> execWriterT (buildBalance x)
 
-buildAmount :: (MonadReader CommodityMap m, Show a)
-            => Balance a
-            -> WriterT Builder m ()
-buildAmount (Amount c q) = do
+buildBalance :: (MonadReader CommodityMap m, Show a)
+             => Balance a
+             -> WriterT Builder m ()
+buildBalance (Amount c q) = do
     mcomm <- view (commodities.at c)
-    case mcomm of
-        Nothing -> error "Attempted to print an unknown commodity"
-        Just comm -> do
-            tell $ fromText (comm^.commSymbol)
-            tell $ fromString (show q)
+    let comm = fromMaybe defaultCommodityInfo mcomm
+    tell $ fromText (comm^.commSymbol)
+    tell $ fromString (show q)
 
-buildAmount (Balance xs) =
-    mapM_ (buildAmount . uncurry Amount) $ IntMap.toList xs
+buildBalance (Balance xs) =
+    mapM_ (buildBalance . uncurry Amount) $ IntMap.toList xs
 
-buildAmount _ = return ()
+buildBalance _ = return ()
+
+balance :: Show a => CommodityMap -> Iso' (Balance a) Text
+balance pool = iso toBalance fromBalance
+  where
+    toBalance   = flip runReader pool . printBalance
+    fromBalance = flip evalState pool . parseBalance
diff --git a/commodities.cabal b/commodities.cabal
--- a/commodities.cabal
+++ b/commodities.cabal
@@ -1,5 +1,5 @@
 Name:          commodities
-Version:       0.1.0
+Version:       0.2.0
 Synopsis:      Library for working with commoditized amounts and price histories
 Description:   Library for working with commoditized amounts and price histories
 License-file:  LICENSE
@@ -26,17 +26,16 @@
     build-depends:
         base                   >= 3 && < 5
       , PSQueue
-      , comonad-transformers   >= 3.0.1
+      , comonad                >= 4.0
       , containers             >= 0.4
       , distributive           >= 0.3
       , keys                   >= 3.0.2
-      , lens                   >= 3.7
+      , lens                   >= 3.10
       , linear                 >= 0.7
       , mtl
       , numbers                >= 2009.8.9
-      , representable-functors >= 3.0.1
       , semigroups
-      , semigroupoids          >= 3.0.2
+      , semigroupoids          >= 4.0
       , text                   >= 0.11.2
       , thyme
       , transformers
diff --git a/test/doctests.hs b/test/doctests.hs
--- a/test/doctests.hs
+++ b/test/doctests.hs
@@ -16,7 +16,7 @@
   : sources
 
 getSources :: IO [FilePath]
-getSources = filter (\x -> ".hs" `isSuffixOf` x) <$> go "src"
+getSources = filter (\x -> ".hs" `isSuffixOf` x) <$> go "Ledger"
   where
     go dir = do
       (dirs, files) <- getFilesAndDirectories dir
