Your understanding is wrong.
The 8 bytes are bytes of IP payload and are in addition to the complete IP header of the packet that caused the error. Typically these 8 bytes will be a portion of the header for the transport protocol. They can be used to match up the ICMP error to the connection, or even potentially the individual packet that caused it.
Furthermore while RFC 792 says that 8 bytes of payload should be included, RFC 1812 states that ICMP errors SHOULD include as much of the original packet as possible (within the 576 byte limitation on the size of the ICMP packet). The motivation for this is to support sane handling of ICMP errors in tunneling scenarios.