diff --git a/Data/CRF/Chain2/Generic/External.hs b/Data/CRF/Chain2/Generic/External.hs
--- a/Data/CRF/Chain2/Generic/External.hs
+++ b/Data/CRF/Chain2/Generic/External.hs
@@ -1,5 +1,5 @@
 module Data.CRF.Chain2.Generic.External
-( Word (..)
+( Word (obs, lbs)
 , mkWord
 , Sent
 , Dist (unDist)
diff --git a/Data/CRF/Chain2/Generic/Train.hs b/Data/CRF/Chain2/Generic/Train.hs
--- a/Data/CRF/Chain2/Generic/Train.hs
+++ b/Data/CRF/Chain2/Generic/Train.hs
@@ -2,7 +2,7 @@
 {-# LANGUAGE PatternGuards #-}
 
 module Data.CRF.Chain2.Generic.Train
-( CodecSpc (..)
+( CodecSpec (..)
 , train
 ) where
 
@@ -19,7 +19,7 @@
 import Data.CRF.Chain2.Generic.Inference (expectedFeatures, accuracy)
 
 -- | A codec specification.
-data CodecSpc a b c o t = CodecSpc
+data CodecSpec a b c o t = CodecSpec
     { mkCodec :: [SentL a b] -> (c, [(Xs o t, Ys t)])
     , encode  :: c -> [SentL a b] -> [(Xs o t, Ys t)] }
 
@@ -31,12 +31,12 @@
 train
     :: (Ord a, Ord b, Eq t, Ord f)
     => SGD.SgdArgs                  -- ^ Args for SGD
-    -> CodecSpc a b c o t           -- ^ Codec specification
+    -> CodecSpec a b c o t          -- ^ Codec specification
     -> FeatGen o t f                -- ^ Feature generation
     -> IO [SentL a b]               -- ^ Training data 'IO' action
     -> Maybe (IO [SentL a b])       -- ^ Maybe evalation data
     -> IO (c, Model o t f)          -- ^ Resulting codec and model
-train sgdArgs CodecSpc{..} ftGen trainIO evalIO'Maybe = do
+train sgdArgs CodecSpec{..} ftGen trainIO evalIO'Maybe = do
     hSetBuffering stdout NoBuffering
     (codec, trainData) <- mkCodec <$> trainIO
     evalDataM <- case evalIO'Maybe of
diff --git a/Data/CRF/Chain2/Pair.hs b/Data/CRF/Chain2/Pair.hs
--- a/Data/CRF/Chain2/Pair.hs
+++ b/Data/CRF/Chain2/Pair.hs
@@ -1,8 +1,21 @@
 {-# LANGUAGE RecordWildCards #-}
 
 module Data.CRF.Chain2.Pair
-( CRF (..)
+( 
+-- * Data types
+  Word (..)
+, mkWord
+, Sent
+, Dist (unDist)
+, mkDist
+, WordL
+, SentL
+
+-- * CRF
+, CRF (..)
+-- ** Training
 , train
+-- ** Tagging
 , tag
 ) where
 
@@ -11,7 +24,7 @@
 import qualified Numeric.SGD as SGD
 
 import Data.CRF.Chain2.Generic.Model (Model, core, withCore)
-import Data.CRF.Chain2.Generic.External (SentL, Sent)
+import Data.CRF.Chain2.Generic.External
 import qualified Data.CRF.Chain2.Generic.Inference as I
 import qualified Data.CRF.Chain2.Generic.Train as T
 
@@ -29,8 +42,8 @@
         _core <- get
         return $ withCore _core featGen
 
-codecSpec :: (Ord a, Ord b, Ord c) => T.CodecSpc a (b, c) (Codec a b c) Ob Lb
-codecSpec = T.CodecSpc
+codecSpec :: (Ord a, Ord b, Ord c) => T.CodecSpec a (b, c) (Codec a b c) Ob Lb
+codecSpec = T.CodecSpec
     { T.mkCodec = mkCodec
     , T.encode  = encodeDataL }
 
diff --git a/crf-chain2-generic.cabal b/crf-chain2-generic.cabal
--- a/crf-chain2-generic.cabal
+++ b/crf-chain2-generic.cabal
@@ -1,5 +1,5 @@
 name:               crf-chain2-generic
-version:            0.1.0
+version:            0.1.1
 synopsis:           Second-order, generic, constrained, linear conditional random fields
 description:
     The library provides implementation of the second-order, linear
