diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,7 @@
+2014-12-03 Sebastian Witte <woozletoff@gmail.com>
+
+    * Add support for extension types
+
 2014-11-13 Rodrigo Setti <rodrigosetti@gmail.com>
 
     * Changes `ObjectInt` data from `Int` to `Int64`, so it can be possible
diff --git a/Data/MessagePack.hs b/Data/MessagePack.hs
--- a/Data/MessagePack.hs
+++ b/Data/MessagePack.hs
@@ -35,6 +35,7 @@
             | ObjectBinary BS.ByteString
             | ObjectArray  [Object]
             | ObjectMap    (M.Map Object Object )
+            | ObjectExt    !Int8 BS.ByteString
     deriving (Eq, Ord, Show)
 
 instance Serialize Object where
@@ -97,6 +98,19 @@
             | size < 0x10000 = putWord8 map16 >> putWord16be (fromIntegral size)
             | otherwise      = putWord8 map32 >> putWord32be (fromIntegral size)
 
+    put (ObjectExt t bytes) = header >> putWord8 (fromIntegral t) >> putByteString bytes
+      where
+        size = BS.length bytes
+        header
+          | size == 1      = putWord8 fixext1
+          | size == 2      = putWord8 fixext2
+          | size == 4      = putWord8 fixext4
+          | size == 8      = putWord8 fixext8
+          | size == 16     = putWord8 fixext16
+          | size < 0x100   = putWord8 ext8  >> putWord8 (fromIntegral size)
+          | size < 0x10000 = putWord8 ext16 >> putWord16be (fromIntegral size)
+          | otherwise      = putWord8 ext32 >> putWord32be (fromIntegral size)
+
     get =
         getWord8 >>= getObject
       where
@@ -148,6 +162,25 @@
                                                    ObjectMap <$> M.fromList <$> replicateM n get
           | k == map32                        = do n <- fromIntegral <$> getWord32be
                                                    ObjectMap <$> M.fromList <$> replicateM n get
+          | k == ext8                         = do n <- fromIntegral <$> getWord8
+                                                   ObjectExt <$> (fromIntegral <$> getWord8)
+                                                             <*> getByteString n
+          | k == ext16                        = do n <- fromIntegral <$> getWord16be
+                                                   ObjectExt <$> (fromIntegral <$> getWord8)
+                                                             <*> getByteString n
+          | k == ext32                        = do n <- fromIntegral <$> getWord32be
+                                                   ObjectExt <$> (fromIntegral <$> getWord8)
+                                                             <*> getByteString n
+          | k == fixext1                      = ObjectExt <$> (fromIntegral <$> getWord8)
+                                                          <*> getByteString 1
+          | k == fixext2                      = ObjectExt <$> (fromIntegral <$> getWord8)
+                                                          <*> getByteString 2
+          | k == fixext4                      = ObjectExt <$> (fromIntegral <$> getWord8)
+                                                          <*> getByteString 4
+          | k == fixext8                      = ObjectExt <$> (fromIntegral <$> getWord8)
+                                                          <*> getByteString 8
+          | k == fixext16                     = ObjectExt <$> (fromIntegral <$> getWord8)
+                                                          <*> getByteString 16
 
           | otherwise                         = fail $ "mark byte not supported: " ++ show k
 
diff --git a/messagepack.cabal b/messagepack.cabal
--- a/messagepack.cabal
+++ b/messagepack.cabal
@@ -1,5 +1,5 @@
 name               : messagepack
-version            : 0.2.1
+version            : 0.3.0
 synopsis           : Serialize instance for Message Pack Object
 description        : Serialize instance for Message Pack Object
 homepage           : https://github.com/rodrigosetti/messagepack
