If the type is set to 'chat' it can happen that implementations that rely on the type evaluate this as a real chat message which is empty. I our extended protocol this is evaluated as an invalid message because all other clients used do not set the type.
That approach seems wrong and is obviously causing problems: You don't need to care about the type of the message containing a 'received'. Also, the assumption that those messages are "empty chat" messages is also wrong. Messages with an empty body element can be considered as empty chat messages. Messages without a body (or html) extension, are very common in XMPP, as it's primarily a data exchange protocol that just often used for (human-to-human) chat.
For example Smack simply filters all messages with the receipt extension, regardless of the type, and invokes the receipt received listeners.