I think (crossing fingers) I have just solved this problem for the time being with my 18-month old, so thought I would share in case it helps.
In our case, DS had got into habit of waking around 5, having some milk, and then going back to sleep until 6.30-7. This was just about tolerable, but then the milk lost its power to get him back to sleep. Then 5 became 4.30 and I decided enough was enough.
I basically did controlled crying/cry it out. So if you're against that in principle, it may not be for you, but it worked. At 4.30 I went in and said 'it's still night time, go back to sleep', patted him and handed him a drink of water and left. I then didn't go back in to the room at all until 6am. For the first two days, he shouted non-stop for 1.5 hours, and didn't go back to sleep. At 6am, I went in to get him, was very jolly, said 'it's morning, time to get up' and turned on the lights. Third day, he woke at 4.50, went in and told him to go back to sleep, and he did so after only 15 mins of shouting. And since then, he has either slept through until past 6am, or if he's woken up, he's gone back to sleep immediately after I've gone in and told him it's still night-time.
So if you think you're tough enough, it's worth a try. I was just not willing to start my day before 6am and was determined to nip this in the bud. He may well revert at some point, I'm not confident that this is it forever but I want to establish the principle that he gets neither milk nor entertainment before 6am.