I found a lot of good arguments against, but one I did not see: ergonomics.

In former times, when all you had was string, int, bool and float, the characters sibf would have been sufficient. But with string + short, the problems begin. Use the whole name for the prefix, or str_name for string? (While names are almost always strings - aren't they?) What's with a Street class? Names get longer and longer, and even if you use CamelCase, it is hard to tell where the type-prefix ends and where the variable-name begins. 

     BorderLayout boderLayoutInnerPanel = new BorderLayout ();
     panelInner.addLayout (borderLayoutInnerPanel);

Okay - you could use underlines, if you don't use them for something else already, or use CamelCase if you used underlines so long: 

     BorderLayout boderLayout_innerPanel = new BorderLayout ();
     panel_inner.addLayout (borderLayout_innerPanel);

     Border_layout boder_layoutInner_panel = new Border_layout ();
     panelInner.add_layout (border_layoutInner_panel);

It's monstrous and if you do it consequently, you will have 

     for (int iI = 0; iI < iMax-1; ++iI)
         for (int iJ = iI; iJ < iMax; ++iMax) 
              int iCount += foo (iI, iJ); 

Either you will end in using useless prefixes for trivial cases, like loop-variables or `count`. When did you recently use a short or a long for a counter? If you make exceptions, you will often loose time, thinking about needing a prefix or not. 

If you have a lot of variables, they get normally grouped in an object browser which is part of your IDE. Now if 40% start with i_ for int, and 40% with s_ for string, and they are alphabetically sorted, it is hard to find the significant part of the name.