I allmänhet i en webbapp vill du att tillståndet ska vara begäran omfattning så mycket som möjligt.
Endast i fallet med optimeringar på mycket låg nivå är det troligt att du någonsin stöter på ett fall där det är lämpligt att skapa singleton-objekt (och chansen även då är att du drar ut sådan caching/delningslogik till en annan klass som dras in som ett beroende av dina andra [request scope]-objekt och gör det singleton scope). Kom ihåg att en singleton i en webbapps sammanhang betyder flera trådar som använder samma objekt. Detta är sällan goda nyheter.
På samma grund är transient scope den enklaste standarden (och det är därför Ninject 2 gör det så) - request scope bör bara komma in i ekvationen när något behöver delas av prestandaskäl, etc. (eller för att det helt enkelt är sammanhanget av delningen [som nämnts i det andra svaret]).