Also, it's interesting to follow the etymology of these sorts of things.
glVertexAttribIPointer descends from EXT_gpu_shader4. All of the "contact" listings come from NVIDIA persons, so they either developed almost entirely on their own or had a major part in it.
Generally, NVIDIA doesn't do something API-wise without a good reason. And note that there is no equivalent framebuffer binding method for integer image buffers. Those deduce whether they're for integer buffers from the fragment shader output values alone.
This leads me to suspect that there is, or at least was at the time, a good hardware-based reason for having the user specify this info up-front. That vertex processing hardware of the day needs to know if it's dealing with integers or floats, and fetching this information from the shader object would be slower or otherwise impair performance.
It should be noted that D3D does not require this up-front knowledge however. So if NVIDIA wanted to make this distinction explicit and up-front in the API, they probably had a good reason for it. Especially since they did this again with NV_shader_buffer_shared_memory, which was their own extension.
I can understand why they wanted to make a new function for integer parameters rather than create new type enumerators. I have no idea at all why they made a new function for doubles; that's just dumb.