diff --git a/src/Web/Telegram/Types.hs b/src/Web/Telegram/Types.hs
--- a/src/Web/Telegram/Types.hs
+++ b/src/Web/Telegram/Types.hs
@@ -16,7 +16,6 @@
     ParseMode (..),
 
     -- ** Chat
-    ChatId (..),
     Chat (..),
     ChatType (..),
     ChatPermissions (..),
@@ -92,7 +91,7 @@
 
 import Data.Aeson
 import Data.Coerce
-import Data.Hashable
+import Data.Int
 import Data.OpenUnion
 import Data.Text (Text)
 import Deriving.Aeson
@@ -103,16 +102,6 @@
 import Web.Telegram.Types.Internal.Sticker
 import Web.Telegram.Types.Internal.User
 import Web.Telegram.Types.Internal.Utils
-
-data ChatId
-  = ChatId Integer
-  | ChanId Text
-  deriving (Show, Eq, Generic, Default, Hashable)
-  deriving (FromJSON, ToJSON) via UntaggedSum ChatId
-
-instance ToHttpApiData ChatId where
-  toQueryParam (ChatId i) = toQueryParam i
-  toQueryParam (ChanId t) = t
 
 -- | Alias to coerce
 coe :: Coercible a b => a -> b
diff --git a/src/Web/Telegram/Types/Interaction.hs b/src/Web/Telegram/Types/Interaction.hs
--- a/src/Web/Telegram/Types/Interaction.hs
+++ b/src/Web/Telegram/Types/Interaction.hs
@@ -29,7 +29,6 @@
 where
 
 import Data.Aeson
-import Data.Hashable
 import Data.OpenUnion
 import Deriving.Aeson
 import Servant.API
@@ -66,6 +65,6 @@
   | FindLocation
   | RecordVideoNote
   | UploadVideoNote
-  deriving (Show, Eq, Ord, Generic, Default, Hashable)
+  deriving (Show, Eq, Ord, Generic, Default)
   deriving (ToJSON, FromJSON) via Snake Action
   deriving (ToHttpApiData) via Serialize Action
diff --git a/src/Web/Telegram/Types/Internal/Common.hs b/src/Web/Telegram/Types/Internal/Common.hs
--- a/src/Web/Telegram/Types/Internal/Common.hs
+++ b/src/Web/Telegram/Types/Internal/Common.hs
@@ -12,8 +12,9 @@
 
 import Control.Applicative
 import Data.Aeson
-import Data.Hashable
+import Data.Int
 import Data.Text (Text)
+import Data.Time.Clock.POSIX
 import Deriving.Aeson
 import Servant.API
 import Web.Telegram.Types.Internal.Keyboard
@@ -28,7 +29,7 @@
   | Group
   | Supergroup
   | Channel
-  deriving (Show, Eq, Ord, Enum, Generic, Default, Hashable)
+  deriving (Show, Eq, Ord, Enum, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via CustomJSON '[SumUntaggedValue, ConstructorTagModifier CamelToSnake] ChatType
@@ -37,7 +38,7 @@
 -- | https://core.telegram.org/bots/api#chat
 data Chat
   = Chat
-      { chatId :: Integer,
+      { chatId :: Int64,
         chatType :: ChatType,
         title :: Maybe Text,
         username :: Maybe Text,
@@ -48,11 +49,11 @@
         inviteLink :: Maybe Text,
         pinnedMessage :: Maybe Message,
         permissions :: Maybe ChatPermissions,
-        slowModeDelay :: Maybe Integer,
-        stickerSetName :: Maybe Integer,
+        slowModeDelay :: Maybe Int,
+        stickerSetName :: Maybe Int,
         canSetStickerSet :: Maybe Bool
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via PrefixedSnake "chat" Chat
@@ -63,7 +64,7 @@
       { metadata :: MessageMetadata,
         content :: MessageContent
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (ToHttpApiData) via Serialize Message
 
 instance FromJSON Message where
@@ -81,23 +82,23 @@
 -- |
 data MessageMetadata
   = MMetadata
-      { messageId :: Integer,
+      { messageId :: Int,
         from :: Maybe User,
-        date :: Integer,
+        date :: POSIXTime,
         chat :: Chat,
         forwardFrom :: Maybe User,
         forwardFromChat :: Maybe Chat,
-        forwardFromMessageId :: Maybe Integer,
+        forwardFromMessageId :: Maybe Int,
         forwardSignature :: Maybe Text,
         forwardSenderName :: Maybe Text,
-        forwardDate :: Maybe Integer,
+        forwardDate :: Maybe POSIXTime,
         replyToMessage :: Maybe Message,
-        editDate :: Maybe Integer,
+        editDate :: Maybe POSIXTime,
         mediaGroupId :: Maybe Text,
         authorSignature :: Maybe Text,
         replyMarkup :: Maybe InlineKeyboardMarkup
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via CustomJSON '[SumUntaggedValue, FieldLabelModifier CamelToSnake] MessageMetadata
@@ -179,10 +180,10 @@
       { channelChatCreated :: Bool
       }
   | MigrateToChatId
-      { migrateToChatId :: Integer
+      { migrateToChatId :: Int64
       }
   | MigrateFromChatId
-      { migrateFromChatId :: Integer
+      { migrateFromChatId :: Int64
       }
   | PinnedMessage
       { pinnedMessage :: Message
@@ -199,7 +200,7 @@
   | PassportData
       { passPortData :: PassportData
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via CustomJSON '[SumUntaggedValue, FieldLabelModifier CamelToSnake] MessageContent
@@ -221,7 +222,7 @@
   | Pre
   | TextLink
   | TextMention
-  deriving (Show, Eq, Ord, Enum, Generic, Default, Hashable)
+  deriving (Show, Eq, Ord, Enum, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via CustomJSON '[SumUntaggedValue, ConstructorTagModifier CamelToSnake] MessageEntityType
@@ -230,13 +231,13 @@
 data MessageEntity
   = MessageEntity
       { entityType :: MessageEntityType,
-        offset :: Integer,
-        length :: Integer,
+        offset :: Int,
+        length :: Int,
         url :: Maybe Text,
         user :: Maybe User,
         language :: Maybe Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via PrefixedSnake "entity" MessageEntity
@@ -252,7 +253,7 @@
         callbackData :: Maybe Text,
         gameShortName :: Maybe Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via PrefixedSnake "callback" CallbackQuery
@@ -265,7 +266,7 @@
         bigFileId :: Text,
         bitFileUniqueId :: Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake ChatPhoto
@@ -278,7 +279,7 @@
   | Restricted
   | Left
   | Kicked
-  deriving (Show, Eq, Ord, Enum, Generic, Default, Hashable)
+  deriving (Show, Eq, Ord, Enum, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via CustomJSON '[SumUntaggedValue, ConstructorTagModifier CamelToSnake] ChatStatus
@@ -288,8 +289,8 @@
   = ChatMember
       { user :: User,
         status :: ChatStatus,
-        customTitle :: Text,
-        untilDate :: Maybe Integer,
+        customTitle :: Maybe Text,
+        untilDate :: Maybe POSIXTime,
         canBeEdited :: Maybe Bool,
         canPostMessages :: Maybe Bool,
         canEditMessages :: Maybe Bool,
@@ -306,7 +307,7 @@
         canSendOtherMesssages :: Maybe Bool,
         canAddWebPagePreviews :: Maybe Bool
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake ChatMember
@@ -323,7 +324,7 @@
         canInviteUsers :: Maybe Bool,
         canPinMessages :: Maybe Bool
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake ChatPermissions
@@ -334,7 +335,7 @@
       { command :: Text,
         description :: Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via OmitNothing BotCommand
@@ -343,9 +344,9 @@
 data LabeledPrice
   = LabeledPrice
       { label :: Text,
-        amount :: Integer
+        amount :: Int
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via OmitNothing LabeledPrice
@@ -357,9 +358,9 @@
         description :: Text,
         startParameter :: Text,
         currency :: Text,
-        totalAmount :: Integer
+        totalAmount :: Int
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake Invoice
@@ -374,7 +375,7 @@
         streetLine2 :: Text,
         postCode :: Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake ShippingAddress
@@ -387,7 +388,7 @@
         email :: Maybe Text,
         shippingAddress :: ShippingAddress
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake OrderInfo
@@ -399,7 +400,7 @@
         title :: Text,
         prices :: Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via PrefixedSnake "option" ShippingOption
@@ -408,14 +409,14 @@
 data SuccessfulPayment
   = SuccessfulPayment
       { currency :: Text,
-        totalAmount :: Integer,
+        totalAmount :: Int,
         invoicePayload :: Text,
         shippingOptionId :: Maybe Text,
         orderInfo :: Maybe OrderInfo,
         telegramPaymentChargeId :: Text,
         providerPaymentChargeId :: Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake SuccessfulPayment
@@ -428,7 +429,7 @@
         invoicePayload :: Text,
         shippingAddress :: ShippingAddress
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via PrefixedSnake "query" ShippingQuery
@@ -439,12 +440,12 @@
       { queryId :: Text,
         from :: User,
         currency :: Text,
-        totalAmount :: Integer,
+        totalAmount :: Int,
         invoicePayload :: Text,
         shippingOptionId :: Maybe String,
         orderInfo :: Maybe OrderInfo
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via PrefixedSnake "query" PreCheckoutQuery
@@ -459,7 +460,7 @@
         textEntities :: Maybe MessageEntity,
         animation :: Animation
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake Game
@@ -469,11 +470,11 @@
 
 data GameHighScore
   = GameHighScore
-      { position :: Integer,
+      { position :: Int,
         user :: User,
-        score :: Integer
+        score :: Int
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via OmitNothing GameHighScore
@@ -481,10 +482,10 @@
 
 data ResponseParameters
   = ResponseParameters
-      { migrateToChatId :: Maybe Integer,
-        retryAfter :: Maybe Integer
+      { migrateToChatId :: Maybe Int64,
+        retryAfter :: Maybe Int
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake ResponseParameters
diff --git a/src/Web/Telegram/Types/Internal/InlineQuery.hs b/src/Web/Telegram/Types/Internal/InlineQuery.hs
--- a/src/Web/Telegram/Types/Internal/InlineQuery.hs
+++ b/src/Web/Telegram/Types/Internal/InlineQuery.hs
@@ -7,7 +7,6 @@
 module Web.Telegram.Types.Internal.InlineQuery where
 
 import Data.Aeson
-import Data.Hashable
 import Data.Text (Text)
 import Deriving.Aeson
 import Servant.API
@@ -25,7 +24,7 @@
         query :: Text,
         offset :: Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via PrefixedSnake' "query" InlineQuery
@@ -42,16 +41,16 @@
         hideUrl :: Maybe Bool,
         description :: Maybe Text,
         thumbUrl :: Maybe Text,
-        thumbWidth :: Maybe Integer,
-        thumbHeight :: Maybe Integer
+        thumbWidth :: Maybe Int,
+        thumbHeight :: Maybe Int
       }
   | InlineQueryResultPhoto
       { resultType :: Text,
         resultId :: Text,
         photoUrl :: Text,
         thumbUrl' :: Text,
-        photoWidth :: Maybe Integer,
-        photoHeight :: Maybe Integer,
+        photoWidth :: Maybe Int,
+        photoHeight :: Maybe Int,
         resultTitle :: Maybe Text,
         description :: Maybe Text,
         caption :: Maybe Text,
@@ -63,9 +62,9 @@
       { resultType :: Text,
         resultId :: Text,
         gifUrl :: Text,
-        gifWidth :: Maybe Integer,
-        gifHeight :: Maybe Integer,
-        gifDuration :: Maybe Integer,
+        gifWidth :: Maybe Int,
+        gifHeight :: Maybe Int,
+        gifDuration :: Maybe Int,
         thumbUrl' :: Text,
         resultTitle :: Maybe Text,
         caption :: Maybe Text,
@@ -77,9 +76,9 @@
       { resultType :: Text,
         resultId :: Text,
         mpeg4Url :: Text,
-        mpeg4Width :: Maybe Integer,
-        mpeg4Height :: Maybe Integer,
-        mpeg4Duration :: Maybe Integer,
+        mpeg4Width :: Maybe Int,
+        mpeg4Height :: Maybe Int,
+        mpeg4Duration :: Maybe Int,
         thumbUrl' :: Text,
         resultTitle :: Maybe Text,
         caption :: Maybe Text,
@@ -96,9 +95,9 @@
         title :: Text,
         caption :: Maybe Text,
         parseMode :: Maybe ParseMode,
-        videoWidth :: Maybe Integer,
-        videoHeight :: Maybe Integer,
-        videoDuration :: Maybe Integer,
+        videoWidth :: Maybe Int,
+        videoHeight :: Maybe Int,
+        videoDuration :: Maybe Int,
         description :: Maybe Text,
         replyMarkup :: Maybe InlineKeyboardMarkup,
         inputMessageContent :: Maybe InputMessageContent
@@ -111,7 +110,7 @@
         caption :: Maybe Text,
         parseMode :: Maybe ParseMode,
         performer :: Maybe Text,
-        audioDuration :: Maybe Integer,
+        audioDuration :: Maybe Int,
         replyMarkup :: Maybe InlineKeyboardMarkup,
         inputMessageContent :: Maybe InputMessageContent
       }
@@ -122,7 +121,7 @@
         title :: Text,
         caption :: Maybe Text,
         parseMode :: Maybe ParseMode,
-        voiceDuration :: Maybe Integer,
+        voiceDuration :: Maybe Int,
         replyMarkup :: Maybe InlineKeyboardMarkup,
         inputMessageContent :: Maybe InputMessageContent
       }
@@ -138,8 +137,8 @@
         replyMarkup :: Maybe InlineKeyboardMarkup,
         inputMessageContent :: Maybe InputMessageContent,
         thumbUrl :: Maybe Text,
-        thumbWidth :: Maybe Integer,
-        thumbHeight :: Maybe Integer
+        thumbWidth :: Maybe Int,
+        thumbHeight :: Maybe Int
       }
   | InlineQueryResultLocation
       { resultType :: Text,
@@ -147,12 +146,12 @@
         latitude :: Float,
         longitude :: Float,
         title :: Text,
-        livePeriod :: Maybe Integer,
+        livePeriod :: Maybe Int,
         replyMarkup :: Maybe InlineKeyboardMarkup,
         inputMessageContent :: Maybe InputMessageContent,
         thumbUrl :: Maybe Text,
-        thumbWidth :: Maybe Integer,
-        thumbHeight :: Maybe Integer
+        thumbWidth :: Maybe Int,
+        thumbHeight :: Maybe Int
       }
   | InlineQueryResultVenue
       { resultType :: Text,
@@ -166,8 +165,8 @@
         replyMarkup :: Maybe InlineKeyboardMarkup,
         inputMessageContent :: Maybe InputMessageContent,
         thumbUrl :: Maybe Text,
-        thumbWidth :: Maybe Integer,
-        thumbHeight :: Maybe Integer
+        thumbWidth :: Maybe Int,
+        thumbHeight :: Maybe Int
       }
   | InlineQueryResultContact
       { resultType :: Text,
@@ -179,8 +178,8 @@
         replyMarkup :: Maybe InlineKeyboardMarkup,
         inputMessageContent :: Maybe InputMessageContent,
         thumbUrl :: Maybe Text,
-        thumbWidth :: Maybe Integer,
-        thumbHeight :: Maybe Integer
+        thumbWidth :: Maybe Int,
+        thumbHeight :: Maybe Int
       }
   | InlineQueryResultGame
       { resultType :: Text,
@@ -268,7 +267,7 @@
         replyMarkup :: Maybe InlineKeyboardMarkup,
         inputMessageContent :: Maybe InputMessageContent
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via PrefixedSnake "result" InlineQueryResult
@@ -282,7 +281,7 @@
         inlineMessageId :: Maybe Text,
         query :: Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake ChosenInlineResult
diff --git a/src/Web/Telegram/Types/Internal/InputFile.hs b/src/Web/Telegram/Types/Internal/InputFile.hs
--- a/src/Web/Telegram/Types/Internal/InputFile.hs
+++ b/src/Web/Telegram/Types/Internal/InputFile.hs
@@ -14,7 +14,6 @@
 
 import Data.ByteString.Lazy (ByteString)
 import qualified Data.ByteString.Lazy as LBS
-import Data.Hashable
 import Data.Proxy
 import Data.Text (Text, pack)
 import Data.Text.Encoding
@@ -31,7 +30,7 @@
         mimeType :: Text,
         content :: ByteString
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
 
 readInput :: FilePath -> IO InputFile
 readInput fp = do
@@ -59,53 +58,53 @@
       }
 
 newtype Cert = Cert InputFile
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (Multi) via InputF "certificate"
 
 newtype Thumb = Thumb InputFile
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (Multi) via InputF "thumb"
 
 newtype Photo = Photo InputFile
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (Multi) via InputF "photo"
 
 newtype Audio = Audio InputFile
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (Multi) via InputF "audio"
 
 newtype Doc = Doc InputFile
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (Multi) via InputF "document"
 
 newtype Video = Video InputFile
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (Multi) via InputF "video"
 
 newtype Animation = Animation InputFile
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (Multi) via InputF "animation"
 
 newtype Voice = Voice InputFile
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (Multi) via InputF "voice"
 
 newtype VideoNote = VideoNote InputFile
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (Multi) via InputF "video_note"
 
 newtype Sticker = Sticker InputFile
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (Multi) via InputF "sticker"
 
 newtype PngSticker = PngSticker InputFile
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (Multi) via InputF "png_sticker"
 
 newtype TgsSticker = TgsSticker InputFile
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (Multi) via InputF "tgs_sticker"
 
 newtype Media = Media InputFile
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (Multi) via InputF "media"
diff --git a/src/Web/Telegram/Types/Internal/InputMedia.hs b/src/Web/Telegram/Types/Internal/InputMedia.hs
--- a/src/Web/Telegram/Types/Internal/InputMedia.hs
+++ b/src/Web/Telegram/Types/Internal/InputMedia.hs
@@ -14,7 +14,6 @@
 module Web.Telegram.Types.Internal.InputMedia where
 
 import Data.Aeson
-import Data.Hashable
 import Data.Maybe (catMaybes)
 import Data.OpenUnion
 import Data.Text (Text)
@@ -28,7 +27,7 @@
   = MarkdownV2
   | HTML
   | Markdown
-  deriving (Show, Eq, Ord, Enum, Generic, Default, Hashable)
+  deriving (Show, Eq, Ord, Enum, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via OmitNothing ParseMode
@@ -85,11 +84,11 @@
         thumb :: Maybe Text,
         caption :: Maybe Text,
         parseMode :: Maybe ParseMode,
-        width :: Maybe Integer,
-        height :: Maybe Integer,
-        duration :: Maybe Integer
+        width :: Maybe Int,
+        height :: Maybe Int,
+        duration :: Maybe Int
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (ToHttpApiData) via Serialize InputMediaAnimation
 
 (.=?) :: ToJSON v => Text -> Maybe v -> Maybe (Text, Value)
@@ -125,11 +124,11 @@
         thumb :: Maybe Text,
         caption :: Maybe Text,
         parseMode :: Maybe ParseMode,
-        duration :: Maybe Integer,
+        duration :: Maybe Int,
         performer :: Maybe Text,
         title :: Maybe Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (ToHttpApiData) via Serialize InputMediaAudio
 
 instance ToJSON InputMediaAudio where
@@ -163,7 +162,7 @@
         caption :: Maybe Text,
         parseMode :: Maybe ParseMode
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (ToHttpApiData) via Serialize InputMediaDocument
 
 instance ToJSON InputMediaDocument where
@@ -193,7 +192,7 @@
         caption :: Maybe Text,
         parseMode :: Maybe ParseMode
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (ToHttpApiData) via Serialize InputMediaPhoto
 
 instance ToJSON InputMediaPhoto where
@@ -223,7 +222,7 @@
         caption :: Maybe Text,
         parseMode :: Maybe ParseMode
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (ToHttpApiData) via Serialize InputMediaVideo
 
 instance ToJSON InputMediaVideo where
@@ -256,7 +255,7 @@
   | InputLocationMessageContent
       { latitude :: Float,
         longitude :: Float,
-        livePeriod :: Maybe Integer
+        livePeriod :: Maybe Int
       }
   | InputVenueMessageContent
       { latitude :: Float,
@@ -272,7 +271,7 @@
         lastName :: Maybe Text,
         vcard :: Maybe Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake InputMessageContent
diff --git a/src/Web/Telegram/Types/Internal/Keyboard.hs b/src/Web/Telegram/Types/Internal/Keyboard.hs
--- a/src/Web/Telegram/Types/Internal/Keyboard.hs
+++ b/src/Web/Telegram/Types/Internal/Keyboard.hs
@@ -10,7 +10,6 @@
 
 import Data.Aeson
 import Data.Aeson.Types
-import Data.Hashable
 import Data.Text (Text)
 import Deriving.Aeson
 import Servant.API
@@ -24,7 +23,7 @@
         oneTimeKeyboard :: Maybe Bool,
         selective :: Maybe Bool
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (ToJSON)
     via Snake ReplyKeyboardMarkup
@@ -35,7 +34,7 @@
       { text :: Text,
         addon :: Maybe KeyboardButtonAddon
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving (ToHttpApiData) via Serialize KeyboardButton
 
 instance ToJSON KeyboardButton where
@@ -48,7 +47,7 @@
   = RequestContact Bool
   | RequestLocation Bool
   | RequestPoll KeyboardButtonPollType
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via CustomJSON '[ConstructorTagModifier CamelToSnake, SumObjectWithSingleField] KeyboardButtonAddon
@@ -57,7 +56,7 @@
   = KeyboardButtonPollType
       { pollType :: Maybe PollType
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via PrefixedSnake "poll" KeyboardButtonPollType
@@ -68,7 +67,7 @@
       { removeKeyboard :: Bool,
         selective :: Maybe Bool
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake ReplyKeyboardRemove
@@ -78,7 +77,7 @@
   = InlineKeyboardMarkup
       { inlineKeyboard :: [[InlineKeyboardButton]]
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (ToJSON, FromJSON)
     via Snake InlineKeyboardMarkup
@@ -94,7 +93,7 @@
         switchInlineQueryCurrentChat :: Maybe Text,
         pay :: Maybe Bool
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake InlineKeyboardButton
@@ -107,7 +106,7 @@
         botUsername :: Maybe Text,
         requestWriteAccess :: Maybe Bool
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake LoginUrl
@@ -118,7 +117,7 @@
       { forceReply :: Bool,
         selective :: Maybe Bool
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake ForceReply
diff --git a/src/Web/Telegram/Types/Internal/Media.hs b/src/Web/Telegram/Types/Internal/Media.hs
--- a/src/Web/Telegram/Types/Internal/Media.hs
+++ b/src/Web/Telegram/Types/Internal/Media.hs
@@ -7,7 +7,6 @@
 module Web.Telegram.Types.Internal.Media where
 
 import Data.Aeson
-import Data.Hashable
 import Data.Text (Text)
 import Deriving.Aeson
 import Servant.API
@@ -18,11 +17,11 @@
   = PhotoSize
       { fileId :: Text,
         fileUniqueId :: Text,
-        width :: Integer,
-        height :: Integer,
-        fileSize :: Maybe Integer
+        width :: Int,
+        height :: Int,
+        fileSize :: Maybe Int
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake PhotoSize
@@ -32,14 +31,14 @@
   = Audio
       { fileId :: Text,
         fileUniqueId :: Text,
-        duration :: Integer,
+        duration :: Int,
         performer :: Maybe Text,
         title :: Maybe Text,
         mimeType :: Maybe Text,
-        fileSize :: Maybe Integer,
+        fileSize :: Maybe Int,
         thumb :: Maybe PhotoSize
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake Audio
@@ -52,9 +51,9 @@
         thumb :: Maybe PhotoSize,
         fileName :: Maybe Text,
         mimeType :: Maybe Text,
-        fileSize :: Maybe Integer
+        fileSize :: Maybe Int
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake Document
@@ -64,14 +63,14 @@
   = Video
       { fileId :: Text,
         fileUniqueId :: Text,
-        width :: Integer,
-        height :: Integer,
-        duration :: Integer,
+        width :: Int,
+        height :: Int,
+        duration :: Int,
         thumb :: Maybe PhotoSize,
         mimeType :: Maybe Text,
-        fileSize :: Maybe Integer
+        fileSize :: Maybe Int
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake Video
@@ -81,15 +80,15 @@
   = Animation
       { fileId :: Text,
         fileUniqueId :: Text,
-        width :: Integer,
-        height :: Integer,
-        duration :: Integer,
+        width :: Int,
+        height :: Int,
+        duration :: Int,
         thumb :: Maybe PhotoSize,
         fileName :: Maybe Text,
         mimeType :: Maybe Text,
-        fileSize :: Integer
+        fileSize :: Int
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake Animation
@@ -99,11 +98,11 @@
   = Voice
       { fileId :: Text,
         fileUniqueId :: Text,
-        duration :: Integer,
+        duration :: Int,
         mimeType :: Maybe Text,
-        fileSize :: Maybe Integer
+        fileSize :: Maybe Int
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake Voice
@@ -113,12 +112,12 @@
   = VideoNote
       { fileId :: Text,
         fileUniqueId :: Text,
-        length :: Integer,
-        duration :: Integer,
+        length :: Int,
+        duration :: Int,
         thumb :: Maybe PhotoSize,
-        fileSize :: Integer
+        fileSize :: Int
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake VideoNote
@@ -129,10 +128,10 @@
       { phoneNumber :: Text,
         firstName :: Text,
         lastName :: Maybe Text,
-        userId :: Maybe Integer,
+        userId :: Maybe Int,
         vcard :: Maybe Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake Contact
@@ -143,7 +142,7 @@
       { longitude :: Float,
         latitude :: Float
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via OmitNothing Location
@@ -157,7 +156,7 @@
         foursquareId :: Maybe Text,
         foursquareType :: Maybe Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake Venue
@@ -166,9 +165,9 @@
 data PollOption
   = PollOption
       { text :: Text,
-        voterCount :: Integer
+        voterCount :: Int
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake PollOption
@@ -178,9 +177,9 @@
   = PollAnswer
       { pollId :: Text,
         user :: User,
-        optionIds :: [Integer]
+        optionIds :: [Int]
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via PrefixedSnake "poll" PollAnswer
@@ -189,7 +188,7 @@
 data PollType
   = Regular
   | Quiz
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via CustomJSON '[SumUntaggedValue, ConstructorTagModifier CamelToSnake] PollType
@@ -200,14 +199,14 @@
       { pollId :: Text,
         question :: Text,
         options :: [PollOption],
-        totalVoterCount :: Integer,
+        totalVoterCount :: Int,
         isClosed :: Bool,
         isAnonymous :: Bool,
         pollType :: PollType,
         allowsMultipleAnswers :: Bool,
-        correctOptionId :: Maybe Integer
+        correctOptionId :: Maybe Int
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via PrefixedSnake "poll" Poll
@@ -215,10 +214,10 @@
 
 data UserProfilePhotos
   = UserProfilePhotos
-      { totalCount :: Integer,
+      { totalCount :: Int,
         photos :: [[PhotoSize]]
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake UserProfilePhotos
@@ -228,10 +227,10 @@
   = File
       { fileId :: Text,
         fileUniqueId :: Text,
-        fileSize :: Maybe Integer,
+        fileSize :: Maybe Int,
         filePath :: Maybe Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake File
diff --git a/src/Web/Telegram/Types/Internal/Passport.hs b/src/Web/Telegram/Types/Internal/Passport.hs
--- a/src/Web/Telegram/Types/Internal/Passport.hs
+++ b/src/Web/Telegram/Types/Internal/Passport.hs
@@ -6,8 +6,8 @@
 
 module Web.Telegram.Types.Internal.Passport where
 
-import Data.Hashable
 import Data.Text (Text)
+import Data.Time.Clock.POSIX
 import Deriving.Aeson
 import Servant.API
 import Web.Telegram.Types.Internal.Utils
@@ -17,7 +17,7 @@
       { passportData :: [EncryptedPassportElement],
         credentials :: EncryptedCredentials
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via PrefixedSnake "passport" PassportData
@@ -27,10 +27,10 @@
   = PassportFile
       { fileId :: Text,
         fileUniqueId :: Text,
-        fileSize :: Integer,
-        fileDate :: Integer
+        fileSize :: Int,
+        fileDate :: POSIXTime
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (ToJSON, FromJSON)
     via Snake PassportFile
@@ -49,7 +49,7 @@
         translation :: Maybe [PassportFile],
         hash :: Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (ToJSON, FromJSON)
     via PrefixedSnake "element" EncryptedPassportElement
@@ -60,7 +60,7 @@
         hash :: Text,
         secret :: Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (ToJSON, FromJSON)
     via PrefixedSnake "credential" EncryptedCredentials
@@ -121,7 +121,7 @@
         elementHash :: Text,
         message :: Text
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (ToJSON, FromJSON)
     via PrefixedSnake "error" PassportElementError
@@ -141,7 +141,7 @@
   | TemporaryRegistration
   | PhoneNumber
   | Email
-  deriving (Show, Eq, Ord, Enum, Generic, Default, Hashable)
+  deriving (Show, Eq, Ord, Enum, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via CustomJSON '[SumUntaggedValue, ConstructorTagModifier CamelToSnake] EncryptedPassportElementType
diff --git a/src/Web/Telegram/Types/Internal/Sticker.hs b/src/Web/Telegram/Types/Internal/Sticker.hs
--- a/src/Web/Telegram/Types/Internal/Sticker.hs
+++ b/src/Web/Telegram/Types/Internal/Sticker.hs
@@ -5,7 +5,6 @@
 
 module Web.Telegram.Types.Internal.Sticker where
 
-import Data.Hashable
 import Data.Text (Text)
 import Deriving.Aeson
 import Servant.API
@@ -16,16 +15,16 @@
   = Sticker
       { fileId :: Text,
         fileUniqueId :: Text,
-        width :: Integer,
-        height :: Integer,
+        width :: Int,
+        height :: Int,
         isAnimated :: Bool,
         thumb :: Maybe PhotoSize,
         emoji :: Maybe Text,
         setName :: Maybe Text,
         maskPosition :: Maybe MaskPosition,
-        fileSize :: Maybe Integer
+        fileSize :: Maybe Int
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake Sticker
@@ -39,7 +38,7 @@
         containsMasks :: Bool,
         stickers :: [Sticker]
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake StickerSet
@@ -52,7 +51,7 @@
         yShift :: Float,
         scale :: Float
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake MaskPosition
diff --git a/src/Web/Telegram/Types/Internal/Update.hs b/src/Web/Telegram/Types/Internal/Update.hs
--- a/src/Web/Telegram/Types/Internal/Update.hs
+++ b/src/Web/Telegram/Types/Internal/Update.hs
@@ -8,9 +8,9 @@
 module Web.Telegram.Types.Internal.Update where
 
 import Data.Aeson
-import Data.Hashable
 import Data.Monoid
 import Data.Text (Text)
+import Data.Time.Clock.POSIX
 import Deriving.Aeson
 import qualified Web.Telegram.Types.Internal.Common as C
 import qualified Web.Telegram.Types.Internal.InlineQuery as IQ
@@ -22,60 +22,60 @@
 data Update
   = -- | New incoming message of any kind — text, photo, sticker, etc.
     Message
-      { updateId :: Integer,
+      { updateId :: Int,
         message :: C.Message
       }
   | -- | New version of a message that is known to the bot and was edited
     EditedMessage
-      { updateId :: Integer,
+      { updateId :: Int,
         message :: C.Message
       }
   | -- | New incoming channel post of any kind — text, photo, sticker, etc.
     ChannelPost
-      { updateId :: Integer,
+      { updateId :: Int,
         message :: C.Message
       }
   | -- | New version of a channel post that is known to the bot and was edited
     EditedChannelPost
-      { updateId :: Integer,
+      { updateId :: Int,
         message :: C.Message
       }
   | -- | New incoming inline query
     InlineQuery
-      { updateId :: Integer,
+      { updateId :: Int,
         iquery :: IQ.InlineQuery
       }
   | -- | The result of an inline query that was chosen by a user and sent to their chat partner. Please see our documentation on the feedback collecting for details on how to enable these updates for your bot
     ChosenInlineResult
-      { updateId :: Integer,
+      { updateId :: Int,
         result :: IQ.ChosenInlineResult
       }
   | -- | New incoming callback query
     CallbackQuery
-      { updateId :: Integer,
+      { updateId :: Int,
         cbquery :: C.CallbackQuery
       }
   | -- | New incoming shipping query. Only for invoices with flexible price
     ShippingQuery
-      { updateId :: Integer,
+      { updateId :: Int,
         squery :: C.ShippingQuery
       }
   | -- | New incoming pre-checkout query. Contains full information about checkout
     PreCheckoutQuery
-      { updateId :: Integer,
+      { updateId :: Int,
         pcquery :: C.PreCheckoutQuery
       }
   | -- | New poll state. Bots receive only updates about stopped polls and polls, which are sent by the bot
     PollUpdate
-      { updateId :: Integer,
+      { updateId :: Int,
         poll :: M.Poll
       }
   | -- | A user changed their answer in a non-anonymous poll. Bots receive new votes only in polls that were sent by the bot itself.
     PollAnswer
-      { updateId :: Integer,
+      { updateId :: Int,
         answer :: M.PollAnswer
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
 
 instance FromJSON Update where
   parseJSON = withObject "Update object" $ \o -> do
@@ -110,17 +110,17 @@
         -- | True, if a custom certificate was provided for webhook certificate checks
         hasCustomCertificate :: Bool,
         -- | Number of updates awaiting delivery
-        pendingUpdateCount :: Integer,
+        pendingUpdateCount :: Int,
         -- | Unix time for the most recent error that happened when trying to deliver an update via webhook
-        lastErrorDate :: Maybe Integer,
+        lastErrorDate :: Maybe POSIXTime,
         -- | Error message in human-readable format for the most recent error that happened when trying to deliver an update via webhook
         lastErrorMessage :: Maybe Text,
         -- | Maximum allowed number of simultaneous HTTPS connections to the webhook for update delivery
-        maxConnections :: Maybe Integer,
+        maxConnections :: Maybe Int,
         -- | A list of update types the bot is subscribed to. Defaults to all update types
         allowedUpdates :: Maybe [UpdateType]
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via Snake WebhookInfo
diff --git a/src/Web/Telegram/Types/Internal/UpdateType.hs b/src/Web/Telegram/Types/Internal/UpdateType.hs
--- a/src/Web/Telegram/Types/Internal/UpdateType.hs
+++ b/src/Web/Telegram/Types/Internal/UpdateType.hs
@@ -5,7 +5,6 @@
 
 module Web.Telegram.Types.Internal.UpdateType where
 
-import Data.Hashable
 import Deriving.Aeson
 import Web.Telegram.Types.Internal.Utils
 
@@ -21,7 +20,7 @@
   | PreCheckoutQuery
   | PollUpdate
   | PollAnswer
-  deriving (Show, Eq, Generic, Default, Ord, Enum, Hashable)
+  deriving (Show, Eq, Generic, Default, Ord, Enum)
   deriving
     (FromJSON, ToJSON)
     via CustomJSON '[SumUntaggedValue, ConstructorTagModifier CamelToSnake] UpdateType
diff --git a/src/Web/Telegram/Types/Internal/User.hs b/src/Web/Telegram/Types/Internal/User.hs
--- a/src/Web/Telegram/Types/Internal/User.hs
+++ b/src/Web/Telegram/Types/Internal/User.hs
@@ -11,7 +11,6 @@
 where
 
 import Data.Aeson
-import Data.Hashable
 import Data.Text (Text)
 import Deriving.Aeson
 import Servant.API
@@ -21,7 +20,7 @@
 data User
   = User
       { -- | Unique identifier for this user or bot
-        userId :: Integer,
+        userId :: Int,
         -- | True, if this user is a bot
         isBot :: Bool,
         -- | User's or bot's first name
@@ -39,7 +38,7 @@
         -- | True, if the bot supports inline queries. Returned only in getMe.
         supportsInlineQueries :: Maybe Bool
       }
-  deriving (Show, Eq, Generic, Default, Hashable)
+  deriving (Show, Eq, Generic, Default)
   deriving
     (FromJSON, ToJSON)
     via PrefixedSnake' "user" User
diff --git a/src/Web/Telegram/Types/Internal/Utils/Default.hs b/src/Web/Telegram/Types/Internal/Utils/Default.hs
--- a/src/Web/Telegram/Types/Internal/Utils/Default.hs
+++ b/src/Web/Telegram/Types/Internal/Utils/Default.hs
@@ -12,6 +12,7 @@
 import Data.Int
 import Data.OpenUnion
 import Data.Text (Text)
+import Data.Time.Clock.POSIX
 import GHC.Generics
 
 class GDefault f where
@@ -85,3 +86,6 @@
 
 instance (Default a, Typeable a) => Default (Union (a ': as)) where
   def = liftUnion (def :: a)
+
+instance Default POSIXTime where
+  def = 0
diff --git a/src/Web/Telegram/Types/Lens.hs b/src/Web/Telegram/Types/Lens.hs
deleted file mode 100644
--- a/src/Web/Telegram/Types/Lens.hs
+++ /dev/null
@@ -1,408 +0,0 @@
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE TypeApplications #-}
-
-module Web.Telegram.Types.Lens {-# DEPRECATED "Use labels from generics-lens instead" #-}  where
-
-import Control.Lens
-import Data.Generics.Product
-
-userId :: HasField "userId" s t a b => Lens s t a b
-userId = field @"userId"
-
-isBot :: HasField "isBot" s t a b => Lens s t a b
-isBot = field @"isBot"
-
-firstName :: HasField "firstName" s t a b => Lens s t a b
-firstName = field @"firstName"
-
-lastName :: HasField "lastName" s t a b => Lens s t a b
-lastName = field @"lastName"
-
-userName :: HasField "userName" s t a b => Lens s t a b
-userName = field @"userName"
-
-languageCode :: HasField "languageCode" s t a b => Lens s t a b
-languageCode = field @"languageCode"
-
-canJoinGroups :: HasField "canJoinGroups" s t a b => Lens s t a b
-canJoinGroups = field @"canJoinGroups"
-
-canReadAllGroupMessages :: HasField "canReadAllGroupMessages" s t a b => Lens s t a b
-canReadAllGroupMessages = field @"canReadAllGroupMessages"
-
-supportsInlineQueries :: HasField "supportsInlineQueries" s t a b => Lens s t a b
-supportsInlineQueries = field @"supportsInlineQueries"
-
-metadata :: HasField "metadata" s t a b => Lens s t a b
-metadata = field @"metadata"
-
-content :: HasField "content" s t a b => Lens s t a b
-content = field @"content"
-
-messageId :: HasField "messageId" s t a b => Lens s t a b
-messageId = field @"messageId"
-
-from :: HasField "from" s t a b => Lens s t a b
-from = field @"from"
-
-date :: HasField "date" s t a b => Lens s t a b
-date = field @"date"
-
-chat :: HasField "chat" s t a b => Lens s t a b
-chat = field @"chat"
-
-forwardFrom :: HasField "forwardFrom" s t a b => Lens s t a b
-forwardFrom = field @"forwardFrom"
-
-forwardFromChat :: HasField "forwardFromChat" s t a b => Lens s t a b
-forwardFromChat = field @"forwardFromChat"
-
-forwardFromMessageId :: HasField "forwardFromMessageId" s t a b => Lens s t a b
-forwardFromMessageId = field @"forwardFromMessageId"
-
-forwardSignature :: HasField "forwardSignature" s t a b => Lens s t a b
-forwardSignature = field @"forwardSignature"
-
-forwardSenderName :: HasField "forwardSenderName" s t a b => Lens s t a b
-forwardSenderName = field @"forwardSenderName"
-
-forwardDate :: HasField "forwardDate" s t a b => Lens s t a b
-forwardDate = field @"forwardDate"
-
-replyToMessage :: HasField "replyToMessage" s t a b => Lens s t a b
-replyToMessage = field @"replyToMessage"
-
-editDate :: HasField "editDate" s t a b => Lens s t a b
-editDate = field @"editDate"
-
-mediaGroupId :: HasField "mediaGroupId" s t a b => Lens s t a b
-mediaGroupId = field @"mediaGroupId"
-
-authorSignature :: HasField "authorSignature" s t a b => Lens s t a b
-authorSignature = field @"authorSignature"
-
-replyMarkup :: HasField "replyMarkup" s t a b => Lens s t a b
-replyMarkup = field @"replyMarkup"
-
-text :: HasField "text" s t a b => Lens s t a b
-text = field @"text"
-
-entities :: HasField "entities" s t a b => Lens s t a b
-entities = field @"entities"
-
-audio :: HasField "audio" s t a b => Lens s t a b
-audio = field @"audio"
-
-document :: HasField "document" s t a b => Lens s t a b
-document = field @"document"
-
-animation :: HasField "animation" s t a b => Lens s t a b
-animation = field @"animation"
-
-game :: HasField "game" s t a b => Lens s t a b
-game = field @"game"
-
-photo :: HasField "photo" s t a b => Lens s t a b
-photo = field @"photo"
-
-sticker :: HasField "sticker" s t a b => Lens s t a b
-sticker = field @"sticker"
-
-video :: HasField "video" s t a b => Lens s t a b
-video = field @"video"
-
-voice :: HasField "voice" s t a b => Lens s t a b
-voice = field @"voice"
-
-videoNote :: HasField "videoNote" s t a b => Lens s t a b
-videoNote = field @"videoNote"
-
-contact :: HasField "contact" s t a b => Lens s t a b
-contact = field @"contact"
-
-location :: HasField "location" s t a b => Lens s t a b
-location = field @"location"
-
-venue :: HasField "venue" s t a b => Lens s t a b
-venue = field @"venue"
-
-poll :: HasField "poll" s t a b => Lens s t a b
-poll = field @"poll"
-
-newChatMembers :: HasField "newChatMembers" s t a b => Lens s t a b
-newChatMembers = field @"newChatMembers"
-
-leftChatMember :: HasField "leftChatMember" s t a b => Lens s t a b
-leftChatMember = field @"leftChatMember"
-
-newChatPhoto :: HasField "newChatPhoto" s t a b => Lens s t a b
-newChatPhoto = field @"newChatPhoto"
-
-deleteChatPhoto :: HasField "deleteChatPhoto" s t a b => Lens s t a b
-deleteChatPhoto = field @"deleteChatPhoto"
-
-groupChatCreated :: HasField "groupChatCreated" s t a b => Lens s t a b
-groupChatCreated = field @"groupChatCreated"
-
-supergroupChatCreated :: HasField "supergroupChatCreated" s t a b => Lens s t a b
-supergroupChatCreated = field @"supergroupChatCreated"
-
-channelChatCreated :: HasField "channelChatCreated" s t a b => Lens s t a b
-channelChatCreated = field @"channelChatCreated"
-
-migrateToChatId :: HasField "migrateToChatId" s t a b => Lens s t a b
-migrateToChatId = field @"migrateToChatId"
-
-migrateFromChatId :: HasField "migrateFromChatId" s t a b => Lens s t a b
-migrateFromChatId = field @"migrateFromChatId"
-
-pinnedMessage :: HasField "pinnedMessage" s t a b => Lens s t a b
-pinnedMessage = field @"pinnedMessage"
-
-invoice :: HasField "invoice" s t a b => Lens s t a b
-invoice = field @"invoice"
-
-successfulPayment :: HasField "successfulPayment" s t a b => Lens s t a b
-successfulPayment = field @"successfulPayment"
-
-connectedWebsite :: HasField "connectedWebsite" s t a b => Lens s t a b
-connectedWebsite = field @"connectedWebsite"
-
-passPortData :: HasField "passPortData" s t a b => Lens s t a b
-passPortData = field @"passPortData"
-
-caption :: HasField "caption" s t a b => Lens s t a b
-caption = field @"caption"
-
-captionEntities :: HasField "captionEntities" s t a b => Lens s t a b
-captionEntities = field @"captionEntities"
-
-chatId :: HasField "chatId" s t a b => Lens s t a b
-chatId = field @"chatId"
-
-chatType :: HasField "chatType" s t a b => Lens s t a b
-chatType = field @"chatType"
-
-title :: HasField "title" s t a b => Lens s t a b
-title = field @"title"
-
-username :: HasField "username" s t a b => Lens s t a b
-username = field @"username"
-
-description :: HasField "description" s t a b => Lens s t a b
-description = field @"description"
-
-inviteLink :: HasField "inviteLink" s t a b => Lens s t a b
-inviteLink = field @"inviteLink"
-
-permissions :: HasField "permissions" s t a b => Lens s t a b
-permissions = field @"permissions"
-
-slowModeDelay :: HasField "slowModeDelay" s t a b => Lens s t a b
-slowModeDelay = field @"slowModeDelay"
-
-stickerSetName :: HasField "stickerSetName" s t a b => Lens s t a b
-stickerSetName = field @"stickerSetName"
-
-canSetStickerSet :: HasField "canSetStickerSet" s t a b => Lens s t a b
-canSetStickerSet = field @"canSetStickerSet"
-
-canSendMessages :: HasField "canSendMessages" s t a b => Lens s t a b
-canSendMessages = field @"canSendMessages"
-
-canSendMediaMessages :: HasField "canSendMediaMessages" s t a b => Lens s t a b
-canSendMediaMessages = field @"canSendMediaMessages"
-
-canSendPolls :: HasField "canSendPolls" s t a b => Lens s t a b
-canSendPolls = field @"canSendPolls"
-
-canSendOtherMesssages :: HasField "canSendOtherMesssages" s t a b => Lens s t a b
-canSendOtherMesssages = field @"canSendOtherMesssages"
-
-canAddWebPagePreviews :: HasField "canAddWebPagePreviews" s t a b => Lens s t a b
-canAddWebPagePreviews = field @"canAddWebPagePreviews"
-
-canChangeInfo :: HasField "canChangeInfo" s t a b => Lens s t a b
-canChangeInfo = field @"canChangeInfo"
-
-canInviteUsers :: HasField "canInviteUsers" s t a b => Lens s t a b
-canInviteUsers = field @"canInviteUsers"
-
-canPinMessages :: HasField "canPinMessages" s t a b => Lens s t a b
-canPinMessages = field @"canPinMessages"
-
-smallFileId :: HasField "smallFileId" s t a b => Lens s t a b
-smallFileId = field @"smallFileId"
-
-smallFileUniqueId :: HasField "smallFileUniqueId" s t a b => Lens s t a b
-smallFileUniqueId = field @"smallFileUniqueId"
-
-bigFileId :: HasField "bigFileId" s t a b => Lens s t a b
-bigFileId = field @"bigFileId"
-
-bitFileUniqueId :: HasField "bitFileUniqueId" s t a b => Lens s t a b
-bitFileUniqueId = field @"bitFileUniqueId"
-
-user :: HasField "user" s t a b => Lens s t a b
-user = field @"user"
-
-status :: HasField "status" s t a b => Lens s t a b
-status = field @"status"
-
-customTitle :: HasField "customTitle" s t a b => Lens s t a b
-customTitle = field @"customTitle"
-
-untilDate :: HasField "untilDate" s t a b => Lens s t a b
-untilDate = field @"untilDate"
-
-canBeEdited :: HasField "canBeEdited" s t a b => Lens s t a b
-canBeEdited = field @"canBeEdited"
-
-canPostMessages :: HasField "canPostMessages" s t a b => Lens s t a b
-canPostMessages = field @"canPostMessages"
-
-canEditMessages :: HasField "canEditMessages" s t a b => Lens s t a b
-canEditMessages = field @"canEditMessages"
-
-canDeleteMessages :: HasField "canDeleteMessages" s t a b => Lens s t a b
-canDeleteMessages = field @"canDeleteMessages"
-
-canRestrictMembers :: HasField "canRestrictMembers" s t a b => Lens s t a b
-canRestrictMembers = field @"canRestrictMembers"
-
-canPromoteMembers :: HasField "canPromoteMembers" s t a b => Lens s t a b
-canPromoteMembers = field @"canPromoteMembers"
-
-isMember :: HasField "isMember" s t a b => Lens s t a b
-isMember = field @"isMember"
-
-fileId :: HasField "fileId" s t a b => Lens s t a b
-fileId = field @"fileId"
-
-fileUniqueId :: HasField "fileUniqueId" s t a b => Lens s t a b
-fileUniqueId = field @"fileUniqueId"
-
-fileSize :: HasField "fileSize" s t a b => Lens s t a b
-fileSize = field @"fileSize"
-
-width :: HasField "width" s t a b => Lens s t a b
-width = field @"width"
-
-height :: HasField "height" s t a b => Lens s t a b
-height = field @"height"
-
-duration :: HasField "duration" s t a b => Lens s t a b
-duration = field @"duration"
-
-performer :: HasField "performer" s t a b => Lens s t a b
-performer = field @"performer"
-
-mimeType :: HasField "mimeType" s t a b => Lens s t a b
-mimeType = field @"mimeType"
-
-thumb :: HasField "thumb" s t a b => Lens s t a b
-thumb = field @"thumb"
-
-phoneNumber :: HasField "phoneNumber" s t a b => Lens s t a b
-phoneNumber = field @"phoneNumber"
-
-vcard :: HasField "vcard" s t a b => Lens s t a b
-vcard = field @"vcard"
-
-longitude :: HasField "longitude" s t a b => Lens s t a b
-longitude = field @"longitude"
-
-latitude :: HasField "latitude" s t a b => Lens s t a b
-latitude = field @"latitude"
-
-address :: HasField "address" s t a b => Lens s t a b
-address = field @"address"
-
-foursquareId :: HasField "foursquareId" s t a b => Lens s t a b
-foursquareId = field @"foursquareId"
-
-foursquareType :: HasField "foursquareType" s t a b => Lens s t a b
-foursquareType = field @"foursquareType"
-
-voterCount :: HasField "voterCount" s t a b => Lens s t a b
-voterCount = field @"voterCount"
-
-pollId :: HasField "pollId" s t a b => Lens s t a b
-pollId = field @"pollId"
-
-question :: HasField "question" s t a b => Lens s t a b
-question = field @"question"
-
-options :: HasField "options" s t a b => Lens s t a b
-options = field @"options"
-
-totalVoterCount :: HasField "totalVoterCount" s t a b => Lens s t a b
-totalVoterCount = field @"totalVoterCount"
-
-isClosed :: HasField "isClosed" s t a b => Lens s t a b
-isClosed = field @"isClosed"
-
-isAnonymous :: HasField "isAnonymous" s t a b => Lens s t a b
-isAnonymous = field @"isAnonymous"
-
-pollType :: HasField "pollType" s t a b => Lens s t a b
-pollType = field @"pollType"
-
-allowsMultipleAnswers :: HasField "allowsMultipleAnswers" s t a b => Lens s t a b
-allowsMultipleAnswers = field @"allowsMultipleAnswers"
-
-correctOptionId :: HasField "correctOptionId" s t a b => Lens s t a b
-correctOptionId = field @"correctOptionId"
-
-optionIds :: HasField "optionIds" s t a b => Lens s t a b
-optionIds = field @"optionIds"
-
-totalCount :: HasField "totalCount" s t a b => Lens s t a b
-totalCount = field @"totalCount"
-
-photos :: HasField "photos" s t a b => Lens s t a b
-photos = field @"photos"
-
-filePath :: HasField "filePath" s t a b => Lens s t a b
-filePath = field @"filePath"
-
-isAnimated :: HasField "isAnimated" s t a b => Lens s t a b
-isAnimated = field @"isAnimated"
-
-emoji :: HasField "emoji" s t a b => Lens s t a b
-emoji = field @"emoji"
-
-setName :: HasField "setName" s t a b => Lens s t a b
-setName = field @"setName"
-
-maskPosition :: HasField "maskPosition" s t a b => Lens s t a b
-maskPosition = field @"maskPosition"
-
-containsMasks :: HasField "containsMasks" s t a b => Lens s t a b
-containsMasks = field @"containsMasks"
-
-stickers :: HasField "stickers" s t a b => Lens s t a b
-stickers = field @"stickers"
-
-name :: HasField "name" s t a b => Lens s t a b
-name = field @"name"
-
-point :: HasField "point" s t a b => Lens s t a b
-point = field @"point"
-
-xShift :: HasField "xShift" s t a b => Lens s t a b
-xShift = field @"xShift"
-
-yShift :: HasField "yShift" s t a b => Lens s t a b
-yShift = field @"yShift"
-
-scale :: HasField "scale" s t a b => Lens s t a b
-scale = field @"scale"
-
-retryAfter :: HasField "retryAfter" s t a b => Lens s t a b
-retryAfter = field @"retryAfter"
-
-command :: HasField "command" s t a b => Lens s t a b
-command = field @"command"
-
diff --git a/telegram-types.cabal b/telegram-types.cabal
--- a/telegram-types.cabal
+++ b/telegram-types.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 1ce7c0f493d00addea341e93ceca1fa8a7969c97530ec77dfbe79d03bc90e100
+-- hash: 8af209cc5d14ad01da13e8a8154044f721fe6a9791344c5d90673220e658ceaa
 
 name:           telegram-types
-version:        0.3.1
+version:        0.4.0
 synopsis:       Types used in Telegram bot API
 description:    Defines various datatypes and their serialization methods useful for writing bindings to Telegram bot API.
 category:       Web
@@ -29,7 +29,6 @@
 library
   exposed-modules:
       Web.Telegram.Types
-      Web.Telegram.Types.Lens
       Web.Telegram.Types.Stock
       Web.Telegram.Types.Interaction
       Web.Telegram.Types.Passport
@@ -61,14 +60,14 @@
     , bytestring >=0.10.10.0 && <0.11
     , deriving-aeson >=0.2.3 && <0.3
     , filepath >=1.4.2.1 && <1.5
-    , generic-lens >=1.2.0.1 && <1.3
-    , hashable >=1.3.0.0 && <1.4
+    , generic-lens >=1.2.0.1 && <2.1
     , lens >=4.18.1 && <4.19
     , mime-types >=0.1.0.9 && <0.2
     , open-union >=0.4.0.0 && <0.5
     , servant >=0.16.2 && <0.17
     , servant-multipart >=0.11.5 && <0.12
     , text >=1.2.4.0 && <1.3
+    , time >=1.9.3 && <1.11
   default-language: Haskell2010
 
 test-suite telegram-types-test
@@ -85,8 +84,7 @@
     , bytestring >=0.10.10.0 && <0.11
     , deriving-aeson >=0.2.3 && <0.3
     , filepath >=1.4.2.1 && <1.5
-    , generic-lens >=1.2.0.1 && <1.3
-    , hashable >=1.3.0.0 && <1.4
+    , generic-lens >=1.2.0.1 && <2.1
     , lens >=4.18.1 && <4.19
     , mime-types >=0.1.0.9 && <0.2
     , open-union >=0.4.0.0 && <0.5
@@ -94,4 +92,5 @@
     , servant-multipart >=0.11.5 && <0.12
     , telegram-types
     , text >=1.2.4.0 && <1.3
+    , time >=1.9.3 && <1.11
   default-language: Haskell2010
