Just put the app in twice, once for Students set to install, once for Teachers set to Self Service. Use scoping to decide who gets what.
Not sure how this will interact with VPP (you might need seperate codes) though, it certainly works in a free apps and Apple ID scenario.
Thanks Look, It works! =)
But I need to fill in fake version number and bundle ID to prevent the duplication. ( I don't know why it works for fake bundle ID ) I still finding a better method. Since we have around 350 apps in catalog and using VPP. If I need to add those app twice. It will be quite tedious. :(
@aikenau You don't want fake data in there.. Rename one of the apps (i.e. 'App - Student') and you can then have both!
@aikenau as @cdenesha says, give it a different name, this is exactly how we did it.

But it warned me the duplicated version number and bundle ID.. ?? :(
Hmm just looking in our JSS now and we don't seem to have the duplication we had previously, maybe your right and it's not working (we have more than one administrator) and was removed.
It turns out it is an issue with 9.92, PI-002302.