I looked at Lucene again and decided that numeric ranges aren't so bad after all. So I added Lucene.query.range which you can use like this:
The query parser doesn't support numeric fields, but I think I can modify it to do this. I would identify any value starting with "#" as a number. If the number ends with "L", it would be long. If it contains a "." then it is double. Else it is integer. Then your query would be:
"+type:user +user_when_created:[#0L TO #100L]"
If this make sense, I will implement it.