The EU on Thursday approved Croatia as the newest member of the border check-free Schengen zone from next month, but Austria and the Netherlands blocked Romania and Bulgaria from joining.
Croatia's accession from January 1 will make it the 27th member of Schengen, which would then comprise 23 of the EU's 27 countries, plus Switzerland, Norway, Liechtenstein and Iceland.
The outcome was bitter news for Bulgaria and Romania, the EU's two poorest nations ,which have been trying for a decade to join Schengen and whose bids were linked together, unlike Croatia's.
Decisions on enlarging Schengen have to be taken unanimously, but Austria applied its veto, fearing that having Bulgaria and Romania in the Schengen area would increase already high inflows of asylum-seekers.
The Netherlands was equally intent on keeping Bulgaria out, which impacted Romania's twinned bid.
"Despite the disappointment that we will see from these two member states, we have a firm decision and readiness to continue" to get into Schengen, said Bulgarian Interior Minister Ivan Demerdzhiev.
"I'm also disappointed" by the outcome for Bulgaria and Romania, EU home affairs commissioner Ylva Johansson told journalists.
The two nations "deserve to be full members of Schengen" and further efforts will be made to get them there within the next two years, she added.
She congratulated Croatia on its accession.
Croatian border police say they are ready to link with other Schengen countries from January 1, but technical preparations mean that the country's airport will only be able to follow from March 26.
Going into Thursday's meeting, Austria's Interior Minister Gerhard Karner said he would apply his country's veto on Bulgaria and Romania.
"I think it is wrong that a system that does not work in many places should be enlarged," he said.
Austria has recorded "over 100,000 illegal border crossings this year", he added.
The Schengen zone allows people travelling between its member countries to cross generally without having to show a passport, ID card or visa.
Interior ministers are often wary of how it allows individuals to enter other EU countries when they do not have the right to do so.
Yet it is often touted as an example of the EU's cherished freedom of movement principle, and has tangible benefits for participating countries, particularly boosting tourism.
German Interior Minister Nancy Faeser said: "I cannot yet understand the vote of my Austrian colleague".
Migration across Europe is a hot political issue.
That is also true for former EU member Britain, which, like EU member Ireland, was never part of Schengen.
Britain's conservative government is trying to reduce the number of asylum-seekers and irregular migrants arriving in small boats from the continent.
Just before the EU ministers' meeting, the interior ministers of Britain, France, Germany, Britain and the Netherlands met to discuss that issue.
French Interior Minister Gerald Darmanin said they had agreed to boost information-sharing on people-smugglers and law enforcement cooperation.
Britain agreed in those talks to set up a working arrangement with Frontex, the EU's border agency, "to contain illegal migration", its Home Office said.
The EU is also dealing with a new right-wing government in Italy that is rejecting boatloads of migrants rescued in the Mediterranean.
Europe overall has taken a harder stance against migration after a massive inflow of asylum-seekers in 2015-2016, when hundreds of thousands of Syrians fled the war in their country.
But reforms demanded by frontline EU states receiving the inflows -- Italy, Spain, Malta and Greece -- have stalled.
Some other EU countries -- including Austria, the Netherlands, Hungary and Poland -- are reluctant to share hosting duties on a systematic scale.
The European Commission has stepped up efforts to make source countries of irregular migrants take back their deported citizens -- especially those with a high proportion trying to enter Europe for economic reasons rather than persecution.