diff --git a/erlang.cabal b/erlang.cabal
--- a/erlang.cabal
+++ b/erlang.cabal
@@ -1,5 +1,5 @@
 name:                erlang
-version:             0.2.1
+version:             0.2.2
 stability:           alpha
 description:
   Speaks the Erlang network protocol and impersonates an Erlang node
diff --git a/src/Foreign/Erlang/Types.hs b/src/Foreign/Erlang/Types.hs
--- a/src/Foreign/Erlang/Types.hs
+++ b/src/Foreign/Erlang/Types.hs
@@ -37,6 +37,7 @@
 import Data.Char          (chr, ord, isPrint)
 import qualified Data.ByteString.Lazy       as B
 import qualified Data.ByteString.Lazy.Char8 as C
+import qualified Data.ByteString.Char8      as BB
 import Data.ByteString.Lazy.Builder
 
 import qualified Data.ByteString            as Byte
@@ -50,6 +51,7 @@
 
 data ErlType = ErlNull
              | ErlInt Int
+             | ErlFloat  Double
              | ErlBigInt Integer
              | ErlString String
              | ErlAtom String
@@ -78,6 +80,14 @@
     fromErlang (ErlInt x)    = x
     fromErlang (ErlBigInt x) = fromIntegral x
 
+instance Erlang Double where
+    toErlang   x            = ErlFloat x 
+    fromErlang (ErlFloat x) = x
+
+instance Erlang Float where
+    toErlang x              = ErlFloat (realToFrac x)
+    fromErlang (ErlFloat x) = realToFrac x
+
 instance Erlang Integer where
     toErlang   x             = ErlBigInt x
     fromErlang (ErlInt x)    = fromIntegral x
@@ -134,6 +144,8 @@
 putErl (ErlInt val)
     | 0 <= val && val < 256 = tag 'a' <> putC val
     | otherwise             = tag 'b' <> putN val
+
+putErl (ErlFloat val)       = tag 'c' <> byteString  (BB.pack . take 31 $ show val ++ repeat '\NUL')
 putErl (ErlAtom val)        = tag 'd' <> putn (length val) <> putA val
 putErl (ErlTuple val)
     | len < 256             = tag 'h' <> putC len <> val'
@@ -182,6 +194,11 @@
                       | otherwise      = x
 
                 return (ErlInt valFrom32)
+      'c' -> do parsed  <- reads . BB.unpack <$> getByteString 31  
+                case parsed of
+                  [(x,remains)]
+                    | all (=='\NUL') remains -> return $ ErlFloat x 
+                  _                          -> fail $ "could not parse float representation: "++show parsed
 
       'd' -> getn >>= liftM ErlAtom . getA
       'e' -> do
