First, there should be a clear distinction between maintenance/support and warranty. In your example, you should have a reasonable warranty that outlines your feature does X, Y, and Z. If it does not do these things, it should be in the warranty that you can (and should) fix it. The warranty should have clear terms of turnaround, response time, and indemnification.
Maintenance and support are separate from warranty in as such that if the user wants an enhancement, compatibility upgrades, etc. they should pay for said enhancement through a maintenance and support contract.
I have found it good practice to set minimum purchase amounts as far as hours go for maintenance and support. This way, someone doesn't buy 30 mins or 1.5 hours from you. Your time is your inventory, and you should sell it as such. Set minimums to reasonable amounts, such as 10 or 20 hours, depending on your client.
When someone comes to you for maintenance and support, they can buy these hours in chunks and do with them as see fit, (within the scope you've defined of course).
It is also good to set an expiration on these hours. This allows you to raise rates accordingly as your skill and demand advances. You don't want someone milking the 100 hours they purchased from you 3 years ago at 1/3 of your current rate.
Finally, maintenance and support should be paid in advance. Since it's support and not necessarily a deliverable, the client essentially "reserves" their spot on your calendar. Otherwise, they should be made aware that if they don't reserve a spot, you might not be available when they need you.