Your biggest problem would be figuring when to send STALL, when to send Zero Length Packets, when to send nothing, and all that higher level stuff.
I just recently updated my VCP implementation, since it had very incorrect implementation for the control transfers (they use one more level of abstraction). I never needed them before, so it was not a huge deal, but I needed them for another projects, and discovered a problem. This may be an argument for using "professional" stacks, but it took a couple hours to fix, and I learned more about USB in the process, so time well spend, really.
With USB everything related to control endpoint is very messed up. Regular endpoints are very easy.
Supporting specific classes adds a whole new level of problems, especially given pretty poor USB documentation. But it is solvable as well.