Mercedes jumped to the top of the board straight away in Q1, with Verstappen half a second behind, while Sebastian Vettel could only manage a time good enough for thirteenth.
Alfa Romeo's Kimi Raikkonen managed to get through into Q2 with thirteenth as Sebastian Vettel just scraped through in fifteenth. Last weekend's race winner, Pierre Gasly missed out, qualifying in sixteenth.
Hamilton moved just ahead of teammate Bottas at the beginning of Q2, with Red Bull only a tenth and a half from the pair, courtesy of Verstappen.
Much better qualifying form for Alexander Albon and Charles Leclerc will see the pair line up in fourth and fifth for tomorrrow's race, with Racing Point teammates Sergio Perez and Lance Stroll in sixth and seventh, the pair swapping positions for the grid with Perez's penalty.
Lando Norris was pushed out be teammate Carlos Sainz as Vettel once again failed to reach the top ten, finishing fourteenth and being out-qualified by the Alfa Romeo of Raikkonen, while teammate Leclerc moved into Q3 with eighth.
Only six-hundredths of a second separated the Mercedes duo for pole at the beginning of Q3, as Red Bull provisionally locked out the second row.
Despite being behind his teammate throughout the session, Perez went ahead of Lance Stroll and took provisional fifth halfway through Q3. Perez however, will be demoted a place from his qualifying position after being awarded a one-place grid penalty for an incident with Raikkonen during Friday's practice.
A spin for Esteban Ocon brought out the yellow flags, forcing Bottas to slow down and therefore not be able to challenge teammate Hamilton for pole as the Briton took his 95th pole position in F1.
Daniel Ricciardo and Carlos Sainz will line up in eighth and ninth. Thanks to his spin, Ocon was not able to improve and will start tenth.
Bahrain International Circuit - Winter testing