You sample them differently. For a R16 texture, you will have something like this in your shader:
uniform sampler2D tex;
in vec2 texCoord;
...
float val = texture(tex, texCoord).r;
For a R16UI texture, it will look like this:
uniform usampler2D tex;
in vec2 texCoord;
...
uint val = texture(tex, texCoord).r;
So for R16UI, you read out an integer value when sampling. R16 on the other hand behaves very much like R8 and similar formats (RGBA8, etc), except that it has twice as much internal precision.
Note that all integer textures, including R16UI, support only NEAREST filtering, or NEAREST_MIPMAP_NEAREST for the minification filter.
There are additional constraints when integer textures are used as render targets. For example, blending is not supported. Consult the specs before using integer render targets to avoid surprises.