What are version bits? What does Pieter Wuille's version bits proposal change? How does a miner signal support for a particular fork? Can the version bits system be used with hard forks?
In the Bitcoin blockchain, each block has a 32-bit field called version. Right now, it takes on simple small values like 2 or 3.

As an example of changes, block version 3 introduced new rules about transaction validity, as well as anti-malleability measures. Miners with the new Bitcoin client create blocks with the version set to 3 to signal their capability to other network participants. Once enough v3 blocks are mined, the Bitcoin clients start enabling their incompatible (potentially fork-causing) new features, and also reject blocks with versions below 3.

The version bits proposal is a generalization of this concept. Suppose someone proposes an incompatible feature X and wants to see if they can gather support for it. They somehow agree on which bit to use in order to show support for this feature, and compatible clients will mine blocks with this bit set to 1. To fabricate an example as an illustration:

Version field: 00001000 00000000 00000010 00000000
                   ^      ^            ^
                   |      |            Supports large blocks
                   |      Does not support infinite inflation
                   Supports cat emoticons


This allows multiple features to be proposed in parallel rather than sequentially.

The rest of the article talks about consensus, recycling old bits, and other related pragmatic considerations.