diff --git a/aws-ec2.cabal b/aws-ec2.cabal
--- a/aws-ec2.cabal
+++ b/aws-ec2.cabal
@@ -1,5 +1,5 @@
 name: aws-ec2
-version: 0.3.6
+version: 0.3.7
 cabal-version: >=1.10
 build-type: Simple
 license: BSD3
@@ -16,7 +16,7 @@
 source-repository this
     type: git
     location: https://github.com/memcachier/aws-ec2.git
-    tag: 0.3.6
+    tag: 0.3.7
 
 source-repository head
     type: git
diff --git a/src/Aws/Ec2/Commands/DescribeInstanceStatus.hs b/src/Aws/Ec2/Commands/DescribeInstanceStatus.hs
--- a/src/Aws/Ec2/Commands/DescribeInstanceStatus.hs
+++ b/src/Aws/Ec2/Commands/DescribeInstanceStatus.hs
@@ -4,14 +4,124 @@
            , OverloadedStrings
            , TemplateHaskell
            , RecordWildCards
-           , OverloadedStrings
            #-}
 
 module Aws.Ec2.Commands.DescribeInstanceStatus where
 
+import Data.Aeson (Value(..), FromJSON, parseJSON, (.:), (.:?))
+import Data.Aeson.Types (typeMismatch)
+import qualified Data.Text as T
+
 import Aws.Ec2.TH
+import Aws.Ec2.Types (InstanceState)
 
 data DescribeInstanceStatus = DescribeInstanceStatus { dis_instanceIds :: [Text] }
                        deriving (Show)
 
 ec2ValueTransactionDef ''DescribeInstanceStatus 'DescribeInstanceStatus "instanceStatusSet" "InstanceId"
+
+
+data InstanceStatusDetailName = Reachability deriving Eq
+
+instance Show InstanceStatusDetailName where
+  show Reachability = "reachability"
+
+instance Read InstanceStatusDetailName where
+  readsPrec _ h =
+    case h of
+      "reachability" -> [(Reachability, "")]
+      _ -> fail $ "Failed to parse " ++ h ++ " into InstanceStatusDetailName."
+
+
+data InstanceStatusDetailStatus = Passed
+                                | Failed
+                                | DInsufficientData
+                                | DInitializing
+                                deriving Eq
+
+instance Show InstanceStatusDetailStatus where
+  show Passed = "passed"
+  show Failed = "failed"
+  show DInsufficientData = "insufficient-data"
+  show DInitializing = "initializing"
+
+instance Read InstanceStatusDetailStatus where
+  readsPrec _ h =
+    case h of
+      "passed" -> [(Passed, "")]
+      "failed" -> [(Failed, "")]
+      "insufficient-data" -> [(DInsufficientData, "")]
+      "initializing" -> [(DInitializing, "")]
+      _ -> fail $ "Failed to parse " ++ h ++ " into InstanceStatusDetailStatus."
+
+
+data InstanceStatusDetails =
+  InstanceStatusDetails { isdName :: InstanceStatusDetailName
+                        , isdStatus :: InstanceStatusDetailStatus
+                        } deriving Show
+
+instance FromJSON InstanceStatusDetails where
+  parseJSON (Object v) = InstanceStatusDetails <$>
+    (read <$> (v .: "name")) <*>
+    (read <$> (v .: "status"))
+  parseJSON invalid = typeMismatch "InstanceState" invalid
+
+
+data InstanceStatusStatus = Ok
+                          | Impaired
+                          | InsufficientData
+                          | NotApplicable
+                          | Initializing
+                          deriving Eq
+
+instance Show InstanceStatusStatus where
+  show Ok = "ok"
+  show Impaired = "impaired"
+  show InsufficientData = "insufficient-data"
+  show NotApplicable = "not-applicable"
+  show Initializing = "initializing"
+
+instance Read InstanceStatusStatus where
+  readsPrec _ h =
+    case h of
+      "ok" -> [(Ok, "")]
+      "impaired" -> [(Impaired, "")]
+      "insufficient-data" -> [(InsufficientData, "")]
+      "not-applicable" -> [(NotApplicable, "")]
+      "initializing" -> [(Initializing, "")]
+      _ -> fail $ "Failed to parse " ++ h ++ " into InstanceStatusStatus."
+
+data InstanceStatusSummary =
+  InstanceStatusSummary { siStatus :: InstanceStatusStatus
+                        , siDetails :: [InstanceStatusDetails]
+                        } deriving Show
+
+instance FromJSON InstanceStatusSummary where
+  parseJSON (Object v) = InstanceStatusSummary <$>
+    (read <$> (v .: "status")) <*>
+    v .: "details"
+  parseJSON invalid = typeMismatch "InstanceStatusSummary" invalid
+
+data InstanceStatus =
+  InstanceStatus { isInstanceId :: T.Text
+                 , isAvailabilityZone :: T.Text
+                 , isInstanceStatus :: Maybe InstanceStatusSummary
+                 , isSystemStatus :: Maybe InstanceStatusSummary
+                 , isState :: Maybe InstanceState
+                 } deriving Show
+
+instance FromJSON InstanceStatus where
+  parseJSON (Object v) = InstanceStatus <$>
+    v .: "instanceId" <*>
+    v .: "availabilityZone" <*>
+    v .:? "instanceStatus" <*>
+    v .:? "systemStatus" <*>
+    v .:? "instanceState"
+  parseJSON invalid = typeMismatch "InstanceStatusSummary" invalid
+
+newtype DescribeInstanceStatusResponse =
+  DescribeInstanceStatusResponse {disrInstanceStatuses :: [InstanceStatus]} deriving (Show)
+
+instance FromJSON DescribeInstanceStatusResponse where
+  parseJSON v = DescribeInstanceStatusResponse <$>
+    (maybeToList <$> parseJSON v)
