diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 3.1.0 (26 May 2017)
+
+* Add support for file message
+
 ## 3.0.1 (26 Apr 2017)
 
 * Use Text instead of String for Beacon dm
diff --git a/line.cabal b/line.cabal
--- a/line.cabal
+++ b/line.cabal
@@ -1,5 +1,5 @@
 name:                line
-version:             3.0.1
+version:             3.1.0
 synopsis:            Haskell SDK for the LINE API
 homepage:            https://github.com/noraesae/line
 license:             BSD3
diff --git a/src/Line/Messaging/Webhook/Types.hs b/src/Line/Messaging/Webhook/Types.hs
--- a/src/Line/Messaging/Webhook/Types.hs
+++ b/src/Line/Messaging/Webhook/Types.hs
@@ -224,6 +224,7 @@
                   | ImageEM ID -- ^ Image event message.
                   | VideoEM ID -- ^ Video event message.
                   | AudioEM ID -- ^ Audio event message.
+                  | FileEM ID T.Text Integer -- ^ File event message.
                   | LocationEM ID Location -- ^ Location event message.
                   | StickerEM ID Sticker -- ^ Sticker event message.
                   deriving (Eq, Show)
@@ -235,6 +236,7 @@
       "image" -> ImageEM <$> v .: "id"
       "video" -> VideoEM <$> v .: "id"
       "audio" -> AudioEM <$> v .: "id"
+      "file" -> FileEM <$> v .: "id" <*> v .: "fileName" <*> (read <$> v .: "fileSize")
       "location" -> LocationEM <$> v .: "id" <*> parseJSON (Object v)
       "sticker" -> StickerEM <$> v .: "id" <*> parseJSON (Object v)
       _ -> fail "EventMessage"
diff --git a/test/Line/Messaging/Webhook/TypesSpec.hs b/test/Line/Messaging/Webhook/TypesSpec.hs
--- a/test/Line/Messaging/Webhook/TypesSpec.hs
+++ b/test/Line/Messaging/Webhook/TypesSpec.hs
@@ -73,6 +73,11 @@
     , ( badAudioMessage, Nothing )
     ]
 
+  describe "file message event" $ fromJSONSpec
+    [ ( goodFileMessage, replyE MessageEvent (FileEM "325708" "hello.txt" 1234) )
+    , ( badFileMessage, Nothing )
+    ]
+
   describe "location message event" $ fromJSONSpec
     [ ( goodLocationMessage, replyE MessageEvent (LocationEM "325708" $
                                                Location
diff --git a/test/Line/Messaging/Webhook/TypesSpecHelper.hs b/test/Line/Messaging/Webhook/TypesSpecHelper.hs
--- a/test/Line/Messaging/Webhook/TypesSpecHelper.hs
+++ b/test/Line/Messaging/Webhook/TypesSpecHelper.hs
@@ -190,6 +190,48 @@
 ] }
 |]
 
+goodFileMessage :: BL.ByteString
+goodFileMessage = [r|
+{ "events": [
+{
+  "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
+  "type": "message",
+  "timestamp": 1462629479859,
+  "source": {
+    "type": "user",
+    "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
+  },
+  "message": {
+    "id": "325708",
+    "type": "file",
+    "fileName": "hello.txt",
+    "fileSize": "1234"
+  }
+}
+] }
+|]
+
+badFileMessage :: BL.ByteString
+badFileMessage = [r|
+{ "events": [
+{
+  "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
+  "type": "message",
+  "timestamp": 1462629479859,
+  "source": {
+    "type": "user",
+    "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
+  },
+  "message": {
+    "id": "325708",
+    "type": "file'",
+    "fileName": "hello.txt",
+    "fileSize": "1234"
+  }
+}
+] }
+|]
+
 goodLocationMessage :: BL.ByteString
 goodLocationMessage = [r|
 { "events": [
