Another 30 were injured in the crash in the municipality of Atoyac in the eastern state of Veracruz, officials said.
A preliminary investigation found that the bus was speeding. The driver lost control of the vehicle over a speed bump and it broke through a safety barrier, the state government said.
The bus fell into the Atoyac river, the statement said.
The death toll was initially given as 16 but rose as more bodies were recovered from under the bus.
The bus was taking players to an amateur football game, local officials said. Children were among the passengers.