Yikes, there's a lot of misinformation in this thread.
fixed32 and fixed64 are unsigned integers encoded directly as 4 or 8 bytes on the wire, in little-endian order. sfixed32 and sfixed64 are the same, but signed -- negative numbers just use two's complement. ZigZag encoding is explicitly designed for use with varint-encoded values, so it doesn't make sense to use it here. Sorry about the naming; it's the result of gradual evolution. Proto1 only had fixed32 and fixed64, which were unsigned from the start. The "sfixed" variants were added in proto2.
Groups are *not* encoded like nested messages. Nested messages are encoded as a length followed by the message contents (the "length-delimited" wire type). Groups are encoded as a start-group tag, followed by the message contents, followed by an end-group tag.
Groups are still used by many protocols inside Google, so all implementations of protobufs that we use internally had to support them. It's possible that some of these protocols will be exposed publicly at some point (though I don't know of any specific examples), which would mean that external implementations need to support them too. However, any *new* protocols should definitely not use them. It's probably safe to not implement them for now, although you should at least recognize the wire type and be able to ignore groups seen on the wire, for forwards-compatibility.