President Volodymyr Zelenskiy first imposed the drastic measures across Ukrainian territory on February 24, just hours after Russia's invasion from the north, south and east.
Martial law gives the military expanded powers and restricts civil liberties such as the right to demonstrate.
Able-bodied men aged 18 to 60 were prohibited from leaving the country and urged to join the fight against the Russians.
Several MPs confirmed via Telegram on Sunday that the extension recently proposed by Zelenskiy had been approved through August 23.
Ukraine traditionally celebrates its Independence Day a day later.
Last week, Ukrainian presidential adviser Oleksiy Arestovych justified the three-month extension of martial law by saying there was no sign the war would be over by autumn.
He added that the Ukrainian population would be given false hope if martial law was prolonged for only 30 days, as it had been in the past.
Also on Sunday, Polish President Andrzej Duda became the first foreign head of state to address the Ukrainian parliament, the Verkhovna Rada, in person since the Russian offensive began.
No one can shake Polish-Ukrainian unity, Duda said in his speech, emphasising: "The free world has the face of Ukraine."
Again and again, the parliamentarians rose to applaud.
Zelenskiy was also present.
Duda's surprise visit was announced only on Sunday morning.
The 50-year-old travelled to Ukraine for the second time since the outbreak of war at the end of February.
Among other things, Duda is campaigning for the neighbouring country to be granted EU candidate status as soon as possible.
"Poland will do everything in its power to help Ukraine become a member of the European Union," Duda said.
Almost 3.5 million Ukrainian refugees have entered Poland since February 24.
Poland has granted refuge to by far the most of the total of about 6.5 million people who have fled Ukraine.
About 44 million people lived in Ukraine before the war began.
Heavy fighting was meanwhile continuing in eastern Ukraine's Donbass, especially around the towns of Sievierodonetsk and Lysychansk.
Positions of Ukrainian troops in the area along the entire front line are being shelled with Russian artillery, the general staff in Kyiv said on Sunday.
Russian troops tried unsuccessfully to storm villages north, east and south of Sievierodonetsk.
They are fighting just as hard for villages south of the route from Lysychansk to Bakhmut in the Donetsk region, they said.
The Russian army has been trying for days to cut off supplies from the Donetsk region to the Ukrainian groups around Sievierodonetsk and Lysychansk.