Git is a content-addressable file system, and it features three types of objects: blobs, trees and commits. In principle, container file formats like ZIP can be interpreted as a similar concept as a single file (or a link) containing a tree in Git terms. Whilst ZIP files and other types of containers do not have any special handling in Git, these containers are just stored as blobs.
For example, let's say I have a ZIP file with a few files with their timestamps (timestamps not handled by Git), empty directories, and having such a ZIP container in a Git repository may be considered required (possibly precompiled JAR files, often edited OpenOffice documents, etc). Now, let's consider the container is getting modified slightly. This would create a quite another blob from Git's perspective therefore making the repository grow drastically as long as the container gets modified repeatedly. I came across an interesting clean/smudge filter that does a similar thing, but it destroys the original ZIP on smudge overwriting the original ZIP erasing original entry timestamps, possibly ZIP comment and whatever else ZIP containers can have (+ as far as I understand, it makes bare repositories hard to use because they don't contain "cleaned" ZIP containers that are only created on checking out), therefore that filter makes little interest to me.
I'm wondering, is it possible to tell Git to store (possibly ZIP) containers as Git first-class citizens like trees and blobs internally? I guess, it does not support such a case, though.
Update 1
I was wrong, as people say below, there are four object types in Git: I missed tag objects. However, I thought they are built on top of commits like notes (probably) do.