diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,26 @@
+0.9
+---
+
+- Make package complaint with Telegram Bot API 6.5 (breaking changes included) (see [#135](https://github.com/fizruk/telegram-bot-simple/pull/135)):
+
+    - `KeyboardButton` extended with `request_user` and `request_chat` fields;
+    - `KeyboardButtonRequestUser` and `KeyboardButtonRequestChat` types added;
+    - `Message` extended with `user_shared` and `chat_shared` fields;
+    - `ChatMember` and `ChatPermissions`: `can_send_media_messages` replaced with following fields:
+        - `can_send_audios`;
+        - `can_send_documents`;
+        - `can_send_photos`;
+        - `can_send_videos`;
+        - `can_send_video_notes`;
+        - `can_send_voice_notes`;
+    - `use_independent_chat_permissions` field added to `setChatPermissions` and `restrictChatMember` methods;
+    - `ChatJoinRequest` extended with `user_chat_id` field.
+    - `Update` type fixed and aligned with the spec.
+
 0.8
 ---
 
-- Make package complaing with Telegram Bot API 6.4 (breaking changes included) (see [#134](https://github.com/fizruk/telegram-bot-simple/pull/134)):
+- Make package complaint with Telegram Bot API 6.4 (breaking changes included) (see [#134](https://github.com/fizruk/telegram-bot-simple/pull/134)):
 
     - `ReplyKeyboardMarkup` extended with `is_persistent`;
     - `Message` extended with `has_media_spoiler`;
diff --git a/src/Telegram/Bot/API/GettingUpdates.hs b/src/Telegram/Bot/API/GettingUpdates.hs
--- a/src/Telegram/Bot/API/GettingUpdates.hs
+++ b/src/Telegram/Bot/API/GettingUpdates.hs
@@ -33,7 +33,7 @@
   , updateChannelPost       :: Maybe Message -- ^ New incoming channel post of any kind — text, photo, sticker, etc.
   , updateEditedChannelPost :: Maybe Message -- ^ New version of a channel post that is known to the bot and was edited
 
-  , updateInlineQuery :: Maybe InlineQuery -- ^ New incoming inline query
+  , updateInlineQuery       :: Maybe InlineQuery -- ^ New incoming inline query
 
   , updateChosenInlineResult :: Maybe ChosenInlineResult -- ^ 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.
 
@@ -41,6 +41,11 @@
 
   , updateShippingQuery     :: Maybe ShippingQuery -- ^ New incoming shipping query. Only for invoices with flexible price
   , updatePreCheckoutQuery  :: Maybe PreCheckoutQuery -- ^ New incoming pre-checkout query. Contains full information about checkout
+  , updatePoll              :: Maybe Poll -- ^ New poll state. Bots receive only updates about stopped polls and polls, which are sent by the bot.
+  , updatePollAnswer        :: Maybe PollAnswer -- ^ A user changed their answer in a non-anonymous poll. Bots receive new votes only in polls that were sent by the bot itself.
+  , updateMyChatMember      :: Maybe ChatMemberUpdated -- ^ The bot's chat member status was updated in a chat. For private chats, this update is received only when the bot is blocked or unblocked by the user.
+  , updateChatMember        :: Maybe ChatMemberUpdated -- ^ A chat member's status was updated in a chat. The bot must be an administrator in the chat and must explicitly specify “chat_member” in the list of allowed_updates to receive these updates.
+  , updateChatJoinRequest   :: Maybe ChatJoinRequest -- ^ A request to join the chat has been sent. The bot must have the can_invite_users administrator right in the chat to receive these updates.
   } deriving (Generic, Show)
 
 instance ToJSON   Update where toJSON = gtoJSON
diff --git a/src/Telegram/Bot/API/Methods.hs b/src/Telegram/Bot/API/Methods.hs
--- a/src/Telegram/Bot/API/Methods.hs
+++ b/src/Telegram/Bot/API/Methods.hs
@@ -944,10 +944,11 @@
 
 -- | Request parameters for 'restrictChatMember'.
 data RestrictChatMemberRequest = RestrictChatMemberRequest
-  { restrictChatMemberChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
-  , restrictChatMemberUserId :: UserId -- ^ Unique identifier of the target user
-  , restrictChatMemberPermissions :: ChatPermissions -- ^ A JSON-serialized object for new user permissions
-  , restrictChatMemberUntilDate :: Maybe Int -- ^ Date when restrictions will be lifted for the user, unix time. If user is restricted for more than 366 days or less than 30 seconds from the current time, they are considered to be restricted forever
+  { restrictChatMemberChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , restrictChatMemberUserId :: UserId -- ^ Unique identifier of the target user.
+  , restrictChatMemberPermissions :: ChatPermissions -- ^ A JSON-serialized object for new user permissions.
+  , restrictChatMemberUseIndependentChatPermissions :: Maybe Bool -- ^ Pass 'True' if chat permissions are set independently. Otherwise, the @can_send_other_messages@ and @can_add_web_page_previews@ permissions will imply the @can_send_messages@, @can_send_audios@, @can_send_documents@, @can_send_photos@, @can_send_videos@, @can_send_video_notes@, and @can_send_voice_notes@ permissions; the @can_send_polls@ permission will imply the @can_send_messages@ permission.
+  , restrictChatMemberUntilDate :: Maybe Int -- ^ Date when restrictions will be lifted for the user, unix time. If user is restricted for more than 366 days or less than 30 seconds from the current time, they are considered to be restricted forever.
   }
   deriving Generic
 
@@ -1015,8 +1016,9 @@
 
 -- | Request parameters for 'setChatPermissions'.
 data SetChatPermissionsRequest = SetChatPermissionsRequest
-  { setChatPermissionsChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
-  , setChatPermissionsPermissions :: ChatPermissions -- ^ A JSON-serialized object for new default chat permissions
+  { setChatPermissionsChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , setChatPermissionsPermissions :: ChatPermissions -- ^ A JSON-serialized object for new default chat permissions.
+  , setChatPermissionsUseIndependentChatPermissions :: Maybe Bool -- ^ Pass 'True' if chat permissions are set independently. Otherwise, the @can_send_other_messages@ and @can_add_web_page_previews@ permissions will imply the @can_send_messages@, @can_send_audios@, @can_send_documents@, @can_send_photos@, @can_send_videos@, @can_send_video_notes@, and @can_send_voice_notes@ permissions; the @can_send_polls@ permission will imply the @can_send_messages@ permission.
   }
   deriving Generic
 
diff --git a/src/Telegram/Bot/API/Types.hs b/src/Telegram/Bot/API/Types.hs
--- a/src/Telegram/Bot/API/Types.hs
+++ b/src/Telegram/Bot/API/Types.hs
@@ -181,10 +181,14 @@
   , messagePinnedMessage         :: Maybe Message -- ^ Specified message was pinned. Note that the Message object in this field will not contain further reply_to_message fields even if it is itself a reply.
   , messageInvoice               :: Maybe Invoice -- ^ Message is an invoice for a payment, information about the invoice.
   , messageSuccessfulPayment     :: Maybe SuccessfulPayment -- ^ Message is a service message about a successful payment, information about the payment.
+  , messageUserShared            :: Maybe UserShared -- ^ Service message: a user was shared with the bot.
+  , messageChatShared            :: Maybe ChatShared -- ^ Service message: a chat was shared with the bot.
   , messageConnectedWebsite      :: Maybe Text -- ^ The domain name of the website on which the user has logged in.
+  , messageWriteAccessAllowed    :: Maybe WriteAccessAllowed -- ^ Service message: the user allowed the bot added to the attachment menu to write messages.
   , messagePassportData          :: Maybe PassportData -- ^ Telegram Passport data.
   , messageProximityAlertTriggered :: Maybe ProximityAlertTriggered -- ^ Service message. A user in the chat triggered another user's proximity alert while sharing Live Location.
   , messageForumTopicCreated     :: Maybe ForumTopicCreated -- ^ Service message: forum topic created.
+  , messageForumTopicEdited     :: Maybe ForumTopicEdited -- ^ Service message: forum topic edited.
   , messageForumTopicClosed     :: Maybe ForumTopicClosed -- ^ Service message: forum topic closed.
   , messageForumTopicReopened     :: Maybe ForumTopicReopened -- ^ Service message: forum topic reopened.
   , messageVideoChatScheduled    :: Maybe VideoChatScheduled -- ^ Service message: video chat scheduled.
@@ -214,6 +218,10 @@
 newtype MediaGroupId = MediaGroupId Text
   deriving (Eq, Show, ToJSON, FromJSON)
 
+-- | Signed 32-bit identifier of the request, which will be received back in the 'UserShared' or 'ChatShared' object. Must be unique within the message.
+newtype RequestId = RequestId Integer
+  deriving (Eq, Show, ToJSON, FromJSON)
+
 -- ** MessageEntity
 
 -- | This object represents one special entity in a text message. For example, hashtags, usernames, URLs, etc.
@@ -505,6 +513,30 @@
 newtype GeneralForumTopicUnhidden = GeneralForumTopicUnhidden Object
   deriving (Generic, Show)
 
+-- ** 'UserShared'
+
+-- | This object contains information about the user whose identifier was shared with the bot using a 'KeyboardButtonRequestUser' button.
+data UserShared = UserShared
+  { userSharedRequestId :: RequestId -- ^ Identifier of the request.
+  , userSharedUserId :: UserId -- ^ Identifier of the shared user. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier. The bot may not have access to the user and could be unable to use this identifier, unless the user is already known to the bot by some other means.
+  }
+  deriving (Generic, Show)
+
+-- ** 'ChatShared'
+
+-- | This object contains information about the chat whose identifier was shared with the bot using a 'KeyboardButtonRequestChat' button.
+data ChatShared = ChatShared
+  { chatSharedRequestId :: RequestId -- ^ Identifier of the request.
+  , chatSharedChatId :: ChatId -- ^ Identifier of the shared chat. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier. The bot may not have access to the chat and could be unable to use this identifier, unless the chat is already known to the bot by some other means.
+  }
+  deriving (Generic, Show)
+
+-- ** 'WriteAccessAllowed'
+
+-- | This object represents a service message about a user allowing a bot added to the attachment menu to write messages. Currently holds no information.
+newtype WriteAccessAllowed = WriteAccessAllowed Object
+  deriving (Generic, Show)
+
 -- ** 'VideoChatScheduled'
 
 -- | This object represents a service message about a video chat scheduled in the chat.
@@ -598,6 +630,31 @@
   }
   deriving (Generic, Show)
 
+-- ** 'KeyboardButtonRequestUser'
+
+-- | This object defines the criteria used to request a suitable user. The identifier of the selected user will be shared with the bot when the corresponding button is pressed.
+data KeyboardButtonRequestUser = KeyboardButtonRequestUser
+  { keyboardButtonRequestUserRequestId :: RequestId -- ^ Signed 32-bit identifier of the request, which will be received back in the 'UserShared' object. Must be unique within the message
+  , keyboardButtonRequestUserUserIsBot :: Maybe Bool -- ^ Pass 'True' to request a bot, pass 'False' to request a regular user. If not specified, no additional restrictions are applied.
+  , keyboardButtonRequestUserUserIsPremium :: Maybe Bool -- ^ Pass 'True' to request a premium user, pass 'False' to request a non-premium user. If not specified, no additional restrictions are applied.
+  }
+  deriving (Generic, Show)
+
+-- ** 'KeyboardButtonRequestChat'
+
+-- | This object defines the criteria used to request a suitable chat. The identifier of the selected chat will be shared with the bot when the corresponding button is pressed.
+data KeyboardButtonRequestChat = KeyboardButtonRequestChat
+  { keyboardButtonRequestChatRequestId :: RequestId -- ^ Signed 32-bit identifier of the request, which will be received back in the 'ChatShared' object. Must be unique within the message
+  , keyboardButtonRequestChatChatIsChannel :: Bool -- ^ Pass 'True' to request a channel chat, pass 'False' to request a group or a supergroup chat. 
+  , keyboardButtonRequestChatChatIsForum :: Maybe Bool -- ^ Pass 'True' to request a forum supergroup, pass 'False' to request a non-forum chat. If not specified, no additional restrictions are applied.
+  , keyboardButtonRequestChatChatHasUsername :: Maybe Bool -- ^ Pass 'True' to request a supergroup or a channel with a username, pass 'False' to request a chat without a username. If not specified, no additional restrictions are applied.
+  , keyboardButtonRequestChatChatIsCreated :: Maybe Bool -- ^ Pass 'True' to request a chat owned by the user. Otherwise, no additional restrictions are applied.
+  , keyboardButtonRequestChatUserAdministratorRights :: Maybe ChatAdministratorRights -- ^ A JSON-serialized object listing the required administrator rights of the user in the chat. The rights must be a superset of @bot_administrator_rights@. If not specified, no additional restrictions are applied.
+  , keyboardButtonRequestChatBotAdministratorRights :: Maybe ChatAdministratorRights -- ^ A JSON-serialized object listing the required administrator rights of the bot in the chat. The rights must be a subset of @user_administrator_rights@. If not specified, no additional restrictions are applied.
+  , keyboardButtonRequestChatBotIsMember :: Maybe Bool -- ^ Pass 'True' to request a chat with the bot as a member. Otherwise, no additional restrictions are applied.
+  }
+  deriving (Generic, Show)
+
 -- ** 'KeyboardButton'
 
 newtype WebAppInfo = WebAppInfo { webAppInfoUrl :: Text }
@@ -608,6 +665,8 @@
 -- to specify text of the button. Optional fields are mutually exclusive.
 data KeyboardButton = KeyboardButton
   { keyboardButtonText            :: Text       -- ^ Text of the button. If none of the optional fields are used, it will be sent as a message when the button is pressed.
+  , keyboardButtonRequestUser     :: Maybe KeyboardButtonRequestUser -- ^ If specified, pressing the button will open a list of suitable users. Tapping on any user will send their identifier to the bot in a “user_shared” service message. Available in private chats only.
+  , keyboardButtonRequestChat     :: Maybe KeyboardButtonRequestChat -- ^ If specified, pressing the button will open a list of suitable chats. Tapping on a chat will send its identifier to the bot in a “chat_shared” service message. Available in private chats only.
   , keyboardButtonRequestContact  :: Maybe Bool -- ^ If 'True', the user's phone number will be sent as a contact when the button is pressed. Available in private chats only.
   , keyboardButtonRequestLocation :: Maybe Bool -- ^ If 'True', the user's current location will be sent when the button is pressed. Available in private chats only.
   , keyboardButtonRequestPoll     :: Maybe PollType -- ^ If specified, the user will be asked to create a poll and send it to the bot when the button is pressed. Available in private chats only.
@@ -616,7 +675,7 @@
   deriving (Generic, Show)
 
 instance IsString KeyboardButton where
-  fromString s = KeyboardButton (fromString s) Nothing Nothing Nothing Nothing
+  fromString s = KeyboardButton (fromString s) Nothing Nothing Nothing Nothing Nothing Nothing
 
 -- ** 'MenuButton'
 
@@ -825,7 +884,12 @@
   -- restricted
   , chatMemberIsMember              :: Maybe Bool -- ^ Restricted only. 'True', if the user is a member of the chat at the moment of the request.
   , chatMemberCanSendMessages       :: Maybe Bool -- ^ Restricted only. 'True', if the user can send text messages, contacts, locations and venues.
-  , chatMemberCanSendMediaMessages  :: Maybe Bool -- ^ Restricted only. 'True', if the user can send audios, documents, photos, videos, video notes and voice notes, implies can_send_messages.
+  , chatMemberCanSendAudios         :: Maybe Bool -- ^ Restricted only. 'True', if the user is allowed to send audios.
+  , chatMemberCanSendDocuments      :: Maybe Bool -- ^ Restricted only. 'True', if the user is allowed to send documents.
+  , chatMemberCanSendPhotos         :: Maybe Bool -- ^ Restricted only. 'True', if the user is allowed to send photos.
+  , chatMemberCanSendVideos         :: Maybe Bool -- ^ Restricted only. 'True', if the user is allowed to send videos.
+  , chatMemberCanSendVideoNotes     :: Maybe Bool -- ^ Restricted only. 'True', if the user is allowed to send video notes.
+  , chatMemberCanSendVoiceNotes     :: Maybe Bool -- ^ Restricted only. 'True', if the user is allowed to send voice notes.
   , chatMemberCanSendPolls          :: Maybe Bool -- ^ Restricted only. 'True', if the user is allowed to send polls.
   , chatMemberCanSendOtherMessages  :: Maybe Bool -- ^ Restricted only. 'True', if the user can send animations, games, stickers and use inline bots, implies can_send_media_messages.
   , chatMemberCanAddWebPagePreviews :: Maybe Bool -- ^ Restricted only. 'True', if user may add web page previews to his messages, implies can_send_media_messages.
@@ -851,6 +915,7 @@
 data ChatJoinRequest = ChatJoinRequest
   { chatJoinRequestChat       :: Chat                 -- ^ Chat to which the request was sent.
   , chatJoinRequestFrom       :: User                 -- ^ User that sent the join request.
+  , chatJoinRequestUserChatId :: ChatId               -- ^ Identifier of a private chat with the user who sent the join request. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier. The bot can use this identifier for 24 hours to send messages until the join request is processed, assuming no other administrator contacted the user.
   , chatJoinRequestDate       :: POSIXTime            -- ^ Date the request was sent in Unix time.
   , chatJoinRequestBio        :: Maybe Text           -- ^ Bio of the user.
   , chatJoinRequestInviteLink :: Maybe ChatInviteLink -- ^ Chat invite link that was used by the user to send the join request.
@@ -862,7 +927,12 @@
 -- | Describes actions that a non-administrator user is allowed to take in a chat.
 data ChatPermissions = ChatPermissions
   { chatPermissionsCanSendMessages :: Maybe Bool       -- ^ 'True', if the user is allowed to send text messages, contacts, locations and venues.
-  , chatPermissionsCanSendMediaMessages :: Maybe Bool  -- ^ 'True', if the user is allowed to send audios, documents, photos, videos, video notes and voice notes, implies can_send_messages.
+  , chatPermissionsCanSendAudios     :: Maybe Bool     -- ^ 'True', if the user is allowed to send audios.
+  , chatPermissionsCanSendDocuments  :: Maybe Bool     -- ^ 'True', if the user is allowed to send documents.
+  , chatPermissionsCanSendPhotos     :: Maybe Bool     -- ^ 'True', if the user is allowed to send photos.
+  , chatPermissionsCanSendVideos     :: Maybe Bool     -- ^ 'True', if the user is allowed to send videos.
+  , chatPermissionsCanSendVideoNotes :: Maybe Bool     -- ^ 'True', if the user is allowed to send video notes.
+  , chatPermissionsCanSendVoiceNotes :: Maybe Bool     -- ^ 'True', if the user is allowed to send voice notes.
   , chatPermissionsCanSendPolls :: Maybe Bool          -- ^ 'True', if the user is allowed to send polls, implies can_send_messages.
   , chatPermissionsCanSendOtherMessages :: Maybe Bool  -- ^ 'True', if the user is allowed to send animations, games, stickers and use inline bots, implies can_send_media_messages.
   , chatPermissionsCanAddWebPagePreviews :: Maybe Bool -- ^ 'True', if the user is allowed to add web page previews to their messages, implies can_send_media_messages.
@@ -1332,6 +1402,8 @@
   , ''File
   , ''ReplyKeyboardMarkup
   , ''KeyboardButton
+  , ''KeyboardButtonRequestUser
+  , ''KeyboardButtonRequestChat
   , ''ReplyKeyboardRemove
   , ''InlineKeyboardMarkup
   , ''InlineKeyboardButton
@@ -1339,6 +1411,7 @@
   , ''ForceReply
   , ''ChatPhoto
   , ''ChatMember
+  , ''ChatMemberUpdated
   , ''ResponseParameters
   , ''MaskPosition
   , ''CallbackGame
@@ -1346,6 +1419,8 @@
   , ''Dice
   , ''Game
   , ''Poll
+  , ''PollAnswer
+  , ''ChatJoinRequest
   , ''PollOption
   , ''MessageAutoDeleteTimerChanged
   , ''ForumTopicCreated
@@ -1354,6 +1429,9 @@
   , ''ForumTopicReopened
   , ''GeneralForumTopicHidden
   , ''GeneralForumTopicUnhidden
+  , ''UserShared
+  , ''ChatShared
+  , ''WriteAccessAllowed
   , ''Invoice
   , ''SuccessfulPayment
   , ''OrderInfo
diff --git a/telegram-bot-simple.cabal b/telegram-bot-simple.cabal
--- a/telegram-bot-simple.cabal
+++ b/telegram-bot-simple.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           telegram-bot-simple
-version:        0.8
+version:        0.9
 synopsis:       Easy to use library for building Telegram bots.
 description:    Please see the README on Github at <https://github.com/fizruk/telegram-bot-simple#readme>
 category:       Web
