We study road congestion as a mechanism design problem. In our basic model we analyze the allocation of a set of drivers among two roads, one of which may be congested. An additional driver on the congestible road imposes an externality on the other drivers by increasing their travel time. Each driver is privately informed about her value of time and asked to report that value to the mechanism designer, who assigns drivers to roads. With a finite number of drivers, there is aggregate uncertainty and the efficient allocation is ex ante unknown. Setting a single Pigouvian price is then not optimal. However, the efficient allocation is implementable by a Vickrey-Clarke-Groves price schedule that lets each driver pay the externality she imposes on other drivers. This allows drivers to pay to have other drivers use the slow road instead of the congestible road. As the number of drivers becomes large, there is a single optimal Pigouvian price that leads to an efficient allocation. However, finding this price requires the mechanism designer to either know the precise distribution of the value of time or the use of our mechanism. We analyze some extensions and apply our model to various congestion problems arising in other contexts.