Miners could agree not to build on purposefully empty or too small blocks. If the majority complies, the risk of getting an empty block ignored by the network costs too much.
This could be done informally just by each node looking at its own memory pool, and not forwarding new blocks which do not contain enough TXs, and miners not building on them. Or a more elaborate scheme could involve some cryptographic proof of neglected TXs.
Probably just the threat of such a scheme is enough to keep miners in line.