diff --git a/Include/rangeobject.h b/Include/rangeobject.h
index 39d20c6..f2d6788 100644
--- a/Include/rangeobject.h
+++ b/Include/rangeobject.h
@@ -38,4 +38,4 @@
 
 #define is_rangeobject(op) ((op)->ob_type == &Rangetype)
 
-extern object *newrangeobject PROTO((long, long, long, int));
+extern object *newrangeobject PROTO((long, long, long));
diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c
index a68d317..0bdbb66 100644
--- a/Objects/rangeobject.c
+++ b/Objects/rangeobject.c
@@ -31,21 +31,18 @@
 	long	start;
 	long	step;
 	long	len;
-	int	reps;
 } rangeobject;
 
 
 object *
-newrangeobject(start, len, step, reps)
+newrangeobject(start, len, step)
 	long start, len, step;
-	int reps;
 {
 	rangeobject *obj = (rangeobject *) newobject(&Rangetype);
 
 	obj->start = start;
 	obj->len   = len;
 	obj->step  = step;
-	obj->reps  = reps;
 
 	return (object *) obj;
 }
@@ -62,19 +59,19 @@
 	rangeobject *r;
 	int i;
 {
-	if (i < 0 || i >= r->len * r->reps) {
+	if (i < 0 || i >= r->len) {
 		err_setstr(IndexError, "range object index out of range");
 		return NULL;
 	}
 
-	return newintobject(r->start + (i % r->len) * r->step);
+	return newintobject(r->start + i * r->step);
 }
 
 static int
 range_length(r)
 	rangeobject *r;
 {
-	return r->len * r->reps;
+	return r->len;
 }
 
 static object *
@@ -82,57 +79,11 @@
 	rangeobject *r;
 {
 	char buf[80];
-	if (r->reps != 1)
-		sprintf(buf, "(xrange(%ld, %ld, %ld) * %d)",
-			r->start,
-			r->start + r->len * r->step,
-			r->step,
-			r->reps);
-	else
-		sprintf(buf, "xrange(%ld, %ld, %ld)",
-			r->start,
-			r->start + r->len * r->step,
-			r->step);
+	sprintf(buf, "xrange(%ld, %ld, %ld)",
+		r->start, r->start + r->len * r->step, r->step);
 	return newstringobject(buf);
 }
 
-object *
-range_concat(r, obj)
-	rangeobject *r;
-	object *obj;
-{
-	if (is_rangeobject(obj)) {
-		rangeobject *s = (rangeobject *)obj;
-		if (r->start == s->start && r->len == s->len &&
-		    r->step == s->step)
-			return newrangeobject(r->start, r->len, r->step,
-					      r->reps + s->reps);
-	}
-	err_setstr(TypeError, "cannot concatenate different range objects");
-	return NULL;
-}
-
-object *
-range_repeat(r, n)
-	rangeobject *r;
-	int n;
-{
-	if (n < 0)
-		return (object *) newrangeobject(0, 0, 1, 1);
-
-	else if (n == 1) {
-		INCREF(r);
-		return (object *) r;
-	}
-
-	else
-		return (object *) newrangeobject(
-						r->start,
-						r->len,
-						r->step,
-						r->reps * n);
-}
-
 static int
 range_compare(r1, r2)
 	rangeobject *r1, *r2;
@@ -145,36 +96,33 @@
 
 	else if (r1->len != r2->len)
 		return r1->len - r2->len;
-
-	else
-		return r1->reps - r2->reps;
 }
 
 static object *
-range_slice(r, low, high)
+range_concat(r, s)
 	rangeobject *r;
-	int low, high;
+	object *s;
 {
-	if (r->reps != 1) {
-		err_setstr(TypeError, "cannot slice a replicated range");
-		return NULL;
-	}
-	if (low < 0)
-		low = 0;
-	else if (low > r->len)
-		low = r->len;
-	if (high < 0)
-		high = 0;
-	if (high < low)
-		high = low;
-	else if (high > r->len)
-		high = r->len;
+	err_setstr(TypeError, "concat not supported by xrange object");
+	return NULL;
+}
 
-	return (object *) newrangeobject(
-				low * r->step + r->start,
-				high - low,
-				r->step,
-				1);
+static object *
+range_repeat(r, n)
+	rangeobject *r;
+	int n;
+{
+	err_setstr(TypeError, "repeat not supported by xrange object");
+	return NULL;
+}
+
+static object *
+range_slice(r, i, j)
+	rangeobject *r;
+	int i, j;
+{
+	err_setstr(TypeError, "slice not supported by xrange object");
+	return NULL;
 }
 
 static sequence_methods range_as_sequence = {
@@ -190,7 +138,7 @@
 typeobject Rangetype = {
 	OB_HEAD_INIT(&Typetype)
 	0,			/* Number of items for varobject */
-	"range",		/* Name of this type */
+	"xrange",		/* Name of this type */
 	sizeof(rangeobject),	/* Basic object size */
 	0,			/* Item size for varobject */
 	range_dealloc,		/*tp_dealloc*/
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 6069ae0..5183069 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -922,7 +922,7 @@
 	if (len < 0)
 		len = 0;
 
-	return newrangeobject(start, len, step, 1);
+	return newrangeobject(start, len, step);
 }
 
 static object *
@@ -1280,16 +1280,10 @@
 {
 	object *result;
 	register int i, j;
-	int len = gettuplesize(tuple), shared = 0;
+	int len = gettuplesize(tuple);
 
-	if (tuple->ob_refcnt == 1) {
-		result = tuple;
-		shared = 1;
-		/* defer INCREF (resizetuple wants it to be one) */
-	}
-	else
-		if ((result = newtupleobject(len)) == NULL)
-			return NULL;
+	if ((result = newtupleobject(len)) == NULL)
+		return NULL;
 
 	for (i = j = 0; i < len; ++i) {
 		object *item, *good;
@@ -1322,14 +1316,10 @@
 	if (resizetuple(&result, j, 0) < 0)
 		return NULL;
 
-	if (shared)
-		INCREF(result);
-
 	return result;
 
 Fail_1:
-	if (!shared)
-		DECREF(result);
+	DECREF(result);
 	return NULL;
 }
 
@@ -1343,28 +1333,15 @@
 {
 	object *result;
 	register int i, j;
-	int len = getstringsize(strobj), shared = 0;
+	int len = getstringsize(strobj);
 
-	if (strobj->ob_refcnt == 1) {
-		result = strobj;
-		shared = 1;
-		/* defer INCREF (resizestring wants it to be one) */
-
-		if (func == None) {
-			INCREF(result);
-			return result;
-		}
+	if (func == None) {
+		/* No character is ever false -- share input string */
+		INCREF(result);
+		return result;
 	}
-	else {
-		if ((result = newsizedstringobject(NULL, len)) == NULL)
-			return NULL;
-
-		if (func == None) {
-			strcpy(GETSTRINGVALUE((stringobject *)result),
-			       GETSTRINGVALUE((stringobject *)strobj));
-			return result;
-		}
-	}
+	if ((result = newsizedstringobject(NULL, len)) == NULL)
+		return NULL;
 
 	for (i = j = 0; i < len; ++i) {
 		object *item, *arg, *good;
@@ -1391,13 +1368,9 @@
 	if (resizestring(&result, j) < 0)
 		return NULL;
 
-	if (shared)
-		INCREF(result);
-
 	return result;
 
 Fail_1:
-	if (!shared)
-		DECREF(result);
+	DECREF(result);
 	return NULL;
 }
