diff --git a/Graphics/PDF.hs b/Graphics/PDF.hs
--- a/Graphics/PDF.hs
+++ b/Graphics/PDF.hs
@@ -15,6 +15,8 @@
 -- module to see how to use it. Or, download the package and look at the test.hs file 
 -- in the Test folder. That file is giving an example of each feature.
 ---------------------------------------------------------
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE CPP #-}
 module Graphics.PDF
   (
   -- * HPDF
@@ -56,6 +58,10 @@
   , module Graphics.PDF.Typesetting
   , module Graphics.PDF.Hyphenate
   ) where
+
+#if !MIN_VERSION_base(4,8,0)
+import Data.Monoid
+#endif
  
 import Graphics.PDF.Hyphenate
 import Graphics.PDF.Typesetting
@@ -83,7 +89,6 @@
 import Graphics.PDF.Resources(emptyResource)
 import Data.Binary.Builder(Builder,fromLazyByteString, toLazyByteString)
 import Graphics.PDF.LowLevel.Serializer
-import Data.Monoid
 import Data.List(unfoldr)
 
 -- | Create a new PDF document and return a first page
@@ -203,7 +208,8 @@
    (length l,last lengths,entries)
 -- foldr writeObject (0,0::Int64,[]) l where
 -- writeObject obj (nb,len,toc) = (nb+1,len + (B.length . toLazyByteString $ obj),(serialize $ (printf "%010d 00000 n \n" ((fromIntegral len)::Integer))) : toc)
- 
+generateStreams :: PDFReference PDFCatalog -> PDFDocumentInfo -> Int -> Int64 -> [Builder]
+                -> [Builder] -> B.ByteString
 generateStreams root di !nb !totalLen ens [] = 
   let entries = reverse (tail ens)  
   in
@@ -250,7 +256,6 @@
           objectEncoding (x,a) = toPDF . PDFReferencedObject (fromIntegral $! x) $ a
           (root,s) = flip runState pdfState  . unPDF $ createPDF >> m >> saveObjects
           objs = objects s
-          k = IM.keys objs 
           encodeAnObject (_,[]) = Nothing 
           encodeAnObject (im,k:t) = 
             let Just o = IM.lookup k im
@@ -263,9 +268,9 @@
               Nothing -> Just (objectEncoding (k,o),(im,t)) 
               Just im' ->  Just (objectEncoding (k,o),(im',t)) 
 
-          encodedObjects = unfoldr encodeAnObject (objs,k)
+          encodedObjects = unfoldr encodeAnObject (objs,IM.keys objs)
           objectContents = header : encodedObjects
-          (nb,len,toc) = writeObjectsAndCreateToc objectContents
+          (_nb, _len, _toc) = writeObjectsAndCreateToc objectContents
       in
       generateStreams root (docInfo pdfState) 0 0 [] objectContents 
 
diff --git a/Graphics/PDF/Document.hs b/Graphics/PDF/Document.hs
--- a/Graphics/PDF/Document.hs
+++ b/Graphics/PDF/Document.hs
@@ -9,7 +9,7 @@
 --
 -- Management of the PDF structure
 ---------------------------------------------------------
-
+{-# LANGUAGE CPP #-}
 module Graphics.PDF.Document(
  -- * Document actions
  -- ** Special document objects
@@ -42,13 +42,16 @@
  , emptyDrawing
  ) where
 
+#if !MIN_VERSION_base(4,8,0)
+import Data.Monoid
+#endif
+
 import Graphics.PDF.LowLevel.Types
 import Graphics.PDF.Draw
 import Graphics.PDF.Pages
 import Control.Monad.State
 import qualified Data.IntMap as IM
 import qualified Data.Map as M
-import Data.Monoid
         
 -- | No information for the document  
 standardDocInfo :: PDFDocumentInfo          
diff --git a/Graphics/PDF/Draw.hs b/Graphics/PDF/Draw.hs
--- a/Graphics/PDF/Draw.hs
+++ b/Graphics/PDF/Draw.hs
@@ -83,7 +83,9 @@
  ) where
  
 import Data.Maybe
+#if !MIN_VERSION_base(4,8,0)
 import Data.Monoid
+#endif
 
 import qualified Data.Map as M
 import qualified Data.IntMap as IM
@@ -168,6 +170,14 @@
 -- | The drawing monad
 newtype Draw a = Draw {unDraw :: forall s. DrawTuple s -> ST s a }
 
+instance Applicative Draw where
+    pure x = Draw $ \_env -> return x
+    df <*> af = Draw $ \env -> do
+       f <- unDraw df env
+       a <- unDraw af env
+       return $ f a
+
+
 instance Monad Draw where
     m >>= f  = Draw $ \env -> do
                           a <- unDraw m env
@@ -452,7 +462,7 @@
 -- | The PDF Monad
 newtype PDF a = PDF {unPDF :: State PdfState a}
 #ifndef __HADDOCK__
-  deriving (Functor, Monad, MonadState PdfState)
+  deriving (Functor, Applicative, Monad, MonadState PdfState)
 #else
 instance Functor PDF
 instance Monad PDF
diff --git a/Graphics/PDF/Image.hs b/Graphics/PDF/Image.hs
--- a/Graphics/PDF/Image.hs
+++ b/Graphics/PDF/Image.hs
@@ -42,12 +42,11 @@
 #endif
 import Data.Char(ord)
 import Data.Bits
-import Control.Monad.Error  
+import qualified Control.Monad.Except as EXC
 import Graphics.PDF.Coordinates
-import Data.Binary.Builder(Builder,fromLazyByteString,singleton)
+import Data.Binary.Builder(Builder,fromLazyByteString)
 import Control.Exception as E
 import qualified Data.Vector.Unboxed as U
-import qualified Data.Bits as BI
 import Data.Word
 
 m_sof0 :: Int
@@ -161,9 +160,9 @@
 io = FA . liftIO
 
 -- | File analyzer monad
-newtype FA a = FA {unFA :: ErrorT String IO a} 
+newtype FA a = FA { unFA :: EXC.ExceptT String IO a}
 #ifndef __HADDOCK__
-  deriving(Monad,MonadError String,Functor)
+  deriving(Monad,Applicative,EXC.MonadError String,Functor)
 #else
 instance Monad FA
 instance MonadError String FA
@@ -172,7 +171,7 @@
 #endif
     
 runFA :: FA a -> IO (Either String a)
-runFA = runErrorT . unFA
+runFA = EXC.runExceptT . unFA
 
 readWord16 :: Handle -> FA Int
 readWord16 h = io $ do
@@ -210,10 +209,11 @@
 parseJpegContent :: Handle -> FA (Int,Int,Int,Int)
 parseJpegContent h = do
     r <- readWord8 h
-    when (r /=  0x0FF) $ throwError (strMsg "No marker found")
+    when (r /=  0x0FF) $ EXC.throwError "No marker found"
     sof <- readWord8 h
     case sof of
-        a | a `elem` [m_sof5,m_sof6,m_sof7,m_sof9,m_sof10,m_sof11,m_sof13,m_sof14,m_sof15] -> throwError (strMsg "Unuspported compression mode")
+        a | a `elem` [m_sof5,m_sof6,m_sof7,m_sof9,m_sof10,m_sof11,m_sof13,m_sof14,m_sof15] ->
+                EXC.throwError "Unuspported compression mode"
           | a `elem` [m_sof0,m_sof1,m_sof3] -> do
               _ <- readWord16 h
               bits_per_component <- readWord8 h
@@ -235,7 +235,7 @@
     io $ hSeek h AbsoluteSeek 0
     -- Check jpeg
     header <- readWord16 h
-    when (header /= 0x0FFD8) $ throwError (strMsg "Not a JPEG File")
+    when (header /= 0x0FFD8) $ EXC.throwError "Not a JPEG File"
    
     -- Extract resolution from jfif
     --res <- optional $ jfif h
@@ -250,7 +250,7 @@
     --io $ print width
     --io $ print color_space
     --io $ hClose h
-    unless (color_space `elem` [1,3,4]) $ throwError (strMsg "Color space not supported")
+    unless (color_space `elem` [1,3,4]) $ EXC.throwError "Color space not supported"
     return (bits_per_component,(fromIntegral height),(fromIntegral width),color_space)
     
 --test = analyzePng "Test/logo.png"
diff --git a/Graphics/PDF/LowLevel/Serializer.hs b/Graphics/PDF/LowLevel/Serializer.hs
--- a/Graphics/PDF/LowLevel/Serializer.hs
+++ b/Graphics/PDF/LowLevel/Serializer.hs
@@ -19,12 +19,16 @@
   SerializeValue(..)
  ) where
    
+   
+#if !MIN_VERSION_base(4,8,0)
+import Data.Monoid
+#endif
+
 import Data.Word 
 import qualified Data.ByteString.Lazy as B
 import qualified Data.Binary.Builder as BU
 import qualified Data.ByteString.Lazy.Char8 as C
 import Foreign.Ptr(Ptr)
-import Data.Monoid
 #if __GLASGOW_HASKELL__ >= 608
 import Data.ByteString.Internal
 import qualified Data.ByteString.Lazy.Internal as L(ByteString(..))
diff --git a/Graphics/PDF/Text.hs b/Graphics/PDF/Text.hs
--- a/Graphics/PDF/Text.hs
+++ b/Graphics/PDF/Text.hs
@@ -13,7 +13,7 @@
 --
 -- PDF Text
 ---------------------------------------------------------
-
+{-# LANGUAGE FlexibleContexts #-}
 module Graphics.PDF.Text(
    -- * Text
    -- ** Types
@@ -136,7 +136,7 @@
 -- | The text monad 
 newtype PDFText a = PDFText {unText :: WriterT Builder (State TextParameter) a}          
 #ifndef __HADDOCK__                    
-  deriving(Monad,Functor,MonadWriter Builder,MonadState TextParameter)
+  deriving(Monad,Applicative,Functor,MonadWriter Builder,MonadState TextParameter)
 #else
 instance Monad PDFText
 instance Functor PDFText
@@ -183,7 +183,8 @@
     tell . serialize $ "\nET"
     return a
  where
-   addFontRsrc f = modifyStrict $ \s -> s { rsrc = addResource (PDFName "Font") (PDFName (show f)) (toRsrc (PDFFont f 0)) (rsrc s)}
+   addFontRsrc f = modifyStrict $ \s ->
+       s { rsrc = addResource (PDFName "Font") (PDFName (show f)) (toRsrc (PDFFont f 0)) (rsrc s)}
    
 -- | Set position for the text beginning
 textStart :: PDFFloat
diff --git a/Graphics/PDF/Typesetting.hs b/Graphics/PDF/Typesetting.hs
--- a/Graphics/PDF/Typesetting.hs
+++ b/Graphics/PDF/Typesetting.hs
@@ -155,7 +155,7 @@
                        
 newtype TM ps s a = TM { unTM :: RWS () [VBox ps s] (TMState ps s) a} 
 #ifndef __HADDOCK__
-  deriving(Monad,MonadWriter [VBox ps s], MonadState (TMState ps s), Functor)
+  deriving(Monad,Applicative,MonadWriter [VBox ps s], MonadState (TMState ps s), Functor)
 #else
 instance Monad TM
 instance MonadWriter [VBox ps s] TM
@@ -165,7 +165,7 @@
 
 newtype Para s a = Para { unPara :: RWS BRState [Letter s] s a} 
 #ifndef __HADDOCK__
-  deriving(Monad,MonadWriter [Letter s], MonadReader BRState, MonadState s, Functor)
+  deriving(Monad,Applicative,MonadWriter [Letter s], MonadReader BRState, MonadState s, Functor)
 #else
 instance Monad Para
 instance MonadWriter [Letter s] Para
diff --git a/Graphics/PDF/Typesetting/Horizontal.hs b/Graphics/PDF/Typesetting/Horizontal.hs
--- a/Graphics/PDF/Typesetting/Horizontal.hs
+++ b/Graphics/PDF/Typesetting/Horizontal.hs
@@ -10,12 +10,17 @@
 -- Horizontal mode
 ---------------------------------------------------------
 -- #hide
+{-# LANGUAGE CPP #-}
 module Graphics.PDF.Typesetting.Horizontal (
    HBox(..)
  , mkHboxWithRatio
  , horizontalPostProcess
  ) where
 
+#if !MIN_VERSION_base(4,8,0)
+import Data.Monoid
+#endif
+
 import Graphics.PDF.LowLevel.Types
 import Graphics.PDF.Typesetting.Breaking
 import Graphics.PDF.Shapes
@@ -30,7 +35,6 @@
 import Control.Monad.Writer(tell)
 import Control.Monad(when)
 import Graphics.PDF.LowLevel.Serializer
-import Data.Monoid
 
 -- | Current word (created from letter) is converted to a PDFString
 saveCurrentword :: String -> PDFString
diff --git a/HPDF.cabal b/HPDF.cabal
--- a/HPDF.cabal
+++ b/HPDF.cabal
@@ -1,5 +1,5 @@
 Name: HPDF
-Version: 1.4.6
+Version: 1.4.7
 cabal-version: >=1.6
 License: BSD3
 License-file:LICENSE
@@ -25,7 +25,7 @@
   TODO.txt
 
 library
-    build-depends: 
+  build-depends: 
       base >= 4 && < 5, 
       containers, 
       random >= 1.0, 
@@ -36,7 +36,7 @@
       mtl,
       vector >=0.10
   
-  ghc-options: -Wall -funbox-strict-fields  -O2
+  ghc-options: -Wall -fno-warn-tabs -funbox-strict-fields  -O2
 
   C-Sources:  
      c/metrics.c
